From 23e78f2afe50f31e958ce29652cb023901c203f0 Mon Sep 17 00:00:00 2001 From: Simon Rieger Date: Mon, 21 Jul 2025 09:42:05 +0200 Subject: [PATCH] fix local diggest tag check --- go/main.go | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/go/main.go b/go/main.go index 8481f29..f51a165 100644 --- a/go/main.go +++ b/go/main.go @@ -66,6 +66,13 @@ func extractDigest(s string) string { return s } +func normalizeImageTag(tag string) string { + if !strings.Contains(tag, ":") { + return tag + ":latest" + } + return tag +} + func checkImageUpdates() { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv) @@ -77,7 +84,6 @@ func checkImageUpdates() { rc := regclient.New() - // Nur laufende Container abrufen containers, err := cli.ContainerList(ctx, container.ListOptions{All: false}) if err != nil { log.Printf("Fehler beim ContainerList: %v", err) @@ -90,25 +96,28 @@ func checkImageUpdates() { return } - // RepoTag → Digest map imageTagToDigest := make(map[string]string) for _, img := range images { for _, tag := range img.RepoTags { + normalizedTag := normalizeImageTag(tag) if len(img.RepoDigests) > 0 { - imageTagToDigest[tag] = extractDigest(img.RepoDigests[0]) + imageTagToDigest[normalizedTag] = extractDigest(img.RepoDigests[0]) } else { - imageTagToDigest[tag] = img.ID + imageTagToDigest[normalizedTag] = img.ID } } } - - for tag, digest := range imageTagToDigest { - log.Printf("imageTagToDigest: %s -> %s\n", tag, digest) + // Debug-Ausgabe aller bekannten imageTagToDigest + fmt.Println("DEBUG: Alle bekannten imageTagToDigest:") + for k, v := range imageTagToDigest { + fmt.Printf(" %s -> %s\n", k, v) } results := make([]ImageStatus, 0) for _, ctr := range containers { - tag := ctr.Image + rawTag := ctr.Image + tag := normalizeImageTag(rawTag) + containerName := "unknown" if len(ctr.Names) > 0 { containerName = ctr.Names[0] @@ -145,22 +154,21 @@ func checkImageUpdates() { containerName, tag, localDigest, remoteDigest) } - labelImg, labelTag := tag, "latest" + imageName, imageTag := tag, "latest" if cp := strings.Split(tag, ":"); len(cp) == 2 { - labelImg, labelTag = cp[0], cp[1] + imageName, imageTag = cp[0], cp[1] } results = append(results, ImageStatus{ ContainerName: containerName, - Image: labelImg, - Tag: labelTag, + Image: imageName, + Tag: imageTag, UpdateAvailable: update, LocalDigest: localDigest, RemoteDigest: remoteDigest, }) } - // Speichern in Cache cache.Lock() cache.Data = results cache.LastCheck = time.Now() @@ -175,7 +183,7 @@ func newImageUpdateCollector() *imageUpdateCollector { return &imageUpdateCollector{ metric: prometheus.NewDesc( "docker_image_update_available", - "Ob Update für das lokale Docker-Image eines laufenden Containers verfügbar ist (1 = Update, 0 = aktuell)", + "Ob ein Update für das verwendete Image eines laufenden Containers verfügbar ist (1 = Update)", []string{"container_name", "image", "tag"}, nil, ), @@ -198,16 +206,15 @@ func (c *imageUpdateCollector) Collect(ch chan<- prometheus.Metric) { } func main() { - log.Printf("🚀 Docker Image Update Exporter gestartet (Intervall = %v)", interval) + log.Printf("🚀 Docker Image Update Exporter gestartet – Intervall: %v", interval) - // Hintergrundprozess zum Aktualisieren des Caches go func() { for { checkImageUpdates() time.Sleep(interval) } }() - checkImageUpdates() // initial + checkImageUpdates() exporter := newImageUpdateCollector() prometheus.MustRegister(exporter)