refactor: update some types in docker.go

This commit is contained in:
henrygd
2025-03-05 23:40:23 -05:00
parent 25b73bfb85
commit 6767392ea8

View File

@@ -22,7 +22,7 @@ type dockerManager struct {
wg sync.WaitGroup // WaitGroup to wait for all goroutines to finish wg sync.WaitGroup // WaitGroup to wait for all goroutines to finish
sem chan struct{} // Semaphore to limit concurrent container requests sem chan struct{} // Semaphore to limit concurrent container requests
containerStatsMutex sync.RWMutex // Mutex to prevent concurrent access to containerStatsMap containerStatsMutex sync.RWMutex // Mutex to prevent concurrent access to containerStatsMap
apiContainerList *[]container.ApiInfo // List of containers from Docker API apiContainerList []*container.ApiInfo // List of containers from Docker API (no pointer)
containerStatsMap map[string]*container.Stats // Keeps track of container stats containerStatsMap map[string]*container.Stats // Keeps track of container stats
validIds map[string]struct{} // Map of valid container ids, used to prune invalid containers from containerStatsMap validIds map[string]struct{} // Map of valid container ids, used to prune invalid containers from containerStatsMap
goodDockerVersion bool // Whether docker version is at least 25.0.0 (one-shot works correctly) goodDockerVersion bool // Whether docker version is at least 25.0.0 (one-shot works correctly)
@@ -64,11 +64,12 @@ func (dm *dockerManager) getDockerStats() ([]*container.Stats, error) {
} }
defer resp.Body.Close() defer resp.Body.Close()
dm.apiContainerList = dm.apiContainerList[:0]
if err := json.NewDecoder(resp.Body).Decode(&dm.apiContainerList); err != nil { if err := json.NewDecoder(resp.Body).Decode(&dm.apiContainerList); err != nil {
return nil, err return nil, err
} }
containersLength := len(*dm.apiContainerList) containersLength := len(dm.apiContainerList)
// store valid ids to clean up old container ids from map // store valid ids to clean up old container ids from map
if dm.validIds == nil { if dm.validIds == nil {
@@ -77,9 +78,10 @@ func (dm *dockerManager) getDockerStats() ([]*container.Stats, error) {
clear(dm.validIds) clear(dm.validIds)
} }
var failedContainers []container.ApiInfo var failedContainers []*container.ApiInfo
for _, ctr := range *dm.apiContainerList { for i := range dm.apiContainerList {
ctr := dm.apiContainerList[i]
ctr.IdShort = ctr.Id[:12] ctr.IdShort = ctr.Id[:12]
dm.validIds[ctr.IdShort] = struct{}{} dm.validIds[ctr.IdShort] = struct{}{}
// check if container is less than 1 minute old (possible restart) // check if container is less than 1 minute old (possible restart)
@@ -134,7 +136,7 @@ func (dm *dockerManager) getDockerStats() ([]*container.Stats, error) {
} }
// Updates stats for individual container // Updates stats for individual container
func (dm *dockerManager) updateContainerStats(ctr container.ApiInfo) error { func (dm *dockerManager) updateContainerStats(ctr *container.ApiInfo) error {
name := ctr.Names[0][1:] name := ctr.Names[0][1:]
resp, err := dm.client.Get("http://localhost/containers/" + ctr.IdShort + "/stats?stream=0&one-shot=1") resp, err := dm.client.Get("http://localhost/containers/" + ctr.IdShort + "/stats?stream=0&one-shot=1")
@@ -269,20 +271,21 @@ func newDockerManager(a *Agent) *dockerManager {
userAgent: "Docker-Client/", userAgent: "Docker-Client/",
} }
dockerClient := &dockerManager{ manager := &dockerManager{
client: &http.Client{ client: &http.Client{
Timeout: timeout, Timeout: timeout,
Transport: userAgentTransport, Transport: userAgentTransport,
}, },
containerStatsMap: make(map[string]*container.Stats), containerStatsMap: make(map[string]*container.Stats),
sem: make(chan struct{}, 5), sem: make(chan struct{}, 5),
apiContainerList: []*container.ApiInfo{},
} }
// If using podman, return client // If using podman, return client
if strings.Contains(dockerHost, "podman") { if strings.Contains(dockerHost, "podman") {
a.systemInfo.Podman = true a.systemInfo.Podman = true
dockerClient.goodDockerVersion = true manager.goodDockerVersion = true
return dockerClient return manager
} }
// Check docker version // Check docker version
@@ -290,24 +293,24 @@ func newDockerManager(a *Agent) *dockerManager {
var versionInfo struct { var versionInfo struct {
Version string `json:"Version"` Version string `json:"Version"`
} }
resp, err := dockerClient.client.Get("http://localhost/version") resp, err := manager.client.Get("http://localhost/version")
if err != nil { if err != nil {
return dockerClient return manager
} }
defer resp.Body.Close() defer resp.Body.Close()
if err := json.NewDecoder(resp.Body).Decode(&versionInfo); err != nil { if err := json.NewDecoder(resp.Body).Decode(&versionInfo); err != nil {
return dockerClient return manager
} }
// if version > 24, one-shot works correctly and we can limit concurrent operations // if version > 24, one-shot works correctly and we can limit concurrent operations
if dockerVersion, err := semver.Parse(versionInfo.Version); err == nil && dockerVersion.Major > 24 { if dockerVersion, err := semver.Parse(versionInfo.Version); err == nil && dockerVersion.Major > 24 {
dockerClient.goodDockerVersion = true manager.goodDockerVersion = true
} else { } else {
slog.Info(fmt.Sprintf("Docker %s is outdated. Upgrade if possible. See https://github.com/henrygd/beszel/issues/58", versionInfo.Version)) slog.Info(fmt.Sprintf("Docker %s is outdated. Upgrade if possible. See https://github.com/henrygd/beszel/issues/58", versionInfo.Version))
} }
return dockerClient return manager
} }
// Test docker / podman sockets and return if one exists // Test docker / podman sockets and return if one exists