fix local diggest tag check

This commit is contained in:
Simon Rieger 2025-07-21 09:42:05 +02:00
parent 8a695bec95
commit 23e78f2afe

View file

@ -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)