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 return s
} }
func normalizeImageTag(tag string) string {
if !strings.Contains(tag, ":") {
return tag + ":latest"
}
return tag
}
func checkImageUpdates() { func checkImageUpdates() {
ctx := context.Background() ctx := context.Background()
cli, err := client.NewClientWithOpts(client.FromEnv) cli, err := client.NewClientWithOpts(client.FromEnv)
@ -77,7 +84,6 @@ func checkImageUpdates() {
rc := regclient.New() rc := regclient.New()
// Nur laufende Container abrufen
containers, err := cli.ContainerList(ctx, container.ListOptions{All: false}) containers, err := cli.ContainerList(ctx, container.ListOptions{All: false})
if err != nil { if err != nil {
log.Printf("Fehler beim ContainerList: %v", err) log.Printf("Fehler beim ContainerList: %v", err)
@ -90,25 +96,28 @@ func checkImageUpdates() {
return return
} }
// RepoTag → Digest map
imageTagToDigest := make(map[string]string) imageTagToDigest := make(map[string]string)
for _, img := range images { for _, img := range images {
for _, tag := range img.RepoTags { for _, tag := range img.RepoTags {
normalizedTag := normalizeImageTag(tag)
if len(img.RepoDigests) > 0 { if len(img.RepoDigests) > 0 {
imageTagToDigest[tag] = extractDigest(img.RepoDigests[0]) imageTagToDigest[normalizedTag] = extractDigest(img.RepoDigests[0])
} else { } else {
imageTagToDigest[tag] = img.ID imageTagToDigest[normalizedTag] = img.ID
} }
} }
} }
// Debug-Ausgabe aller bekannten imageTagToDigest
for tag, digest := range imageTagToDigest { fmt.Println("DEBUG: Alle bekannten imageTagToDigest:")
log.Printf("imageTagToDigest: %s -> %s\n", tag, digest) for k, v := range imageTagToDigest {
fmt.Printf(" %s -> %s\n", k, v)
} }
results := make([]ImageStatus, 0) results := make([]ImageStatus, 0)
for _, ctr := range containers { for _, ctr := range containers {
tag := ctr.Image rawTag := ctr.Image
tag := normalizeImageTag(rawTag)
containerName := "unknown" containerName := "unknown"
if len(ctr.Names) > 0 { if len(ctr.Names) > 0 {
containerName = ctr.Names[0] containerName = ctr.Names[0]
@ -145,22 +154,21 @@ func checkImageUpdates() {
containerName, tag, localDigest, remoteDigest) containerName, tag, localDigest, remoteDigest)
} }
labelImg, labelTag := tag, "latest" imageName, imageTag := tag, "latest"
if cp := strings.Split(tag, ":"); len(cp) == 2 { if cp := strings.Split(tag, ":"); len(cp) == 2 {
labelImg, labelTag = cp[0], cp[1] imageName, imageTag = cp[0], cp[1]
} }
results = append(results, ImageStatus{ results = append(results, ImageStatus{
ContainerName: containerName, ContainerName: containerName,
Image: labelImg, Image: imageName,
Tag: labelTag, Tag: imageTag,
UpdateAvailable: update, UpdateAvailable: update,
LocalDigest: localDigest, LocalDigest: localDigest,
RemoteDigest: remoteDigest, RemoteDigest: remoteDigest,
}) })
} }
// Speichern in Cache
cache.Lock() cache.Lock()
cache.Data = results cache.Data = results
cache.LastCheck = time.Now() cache.LastCheck = time.Now()
@ -175,7 +183,7 @@ func newImageUpdateCollector() *imageUpdateCollector {
return &imageUpdateCollector{ return &imageUpdateCollector{
metric: prometheus.NewDesc( metric: prometheus.NewDesc(
"docker_image_update_available", "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"}, []string{"container_name", "image", "tag"},
nil, nil,
), ),
@ -198,16 +206,15 @@ func (c *imageUpdateCollector) Collect(ch chan<- prometheus.Metric) {
} }
func main() { 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() { go func() {
for { for {
checkImageUpdates() checkImageUpdates()
time.Sleep(interval) time.Sleep(interval)
} }
}() }()
checkImageUpdates() // initial checkImageUpdates()
exporter := newImageUpdateCollector() exporter := newImageUpdateCollector()
prometheus.MustRegister(exporter) prometheus.MustRegister(exporter)