mirror of
https://github.com/crazy-max/diun.git
synced 2025-12-21 13:23:09 +01:00
Skip dangling images (#98)
This commit is contained in:
@@ -36,14 +36,20 @@ func (c *Client) listContainerImage() []model.Image {
|
|||||||
|
|
||||||
var list []model.Image
|
var list []model.Image
|
||||||
for _, ctn := range ctns {
|
for _, ctn := range ctns {
|
||||||
local, err := cli.IsLocalImage(ctn.Image)
|
imageRaw, err := cli.RawImage(ctn.Image)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error().Err(err).Msgf("Cannot inspect image from container %s", ctn.ID)
|
c.logger.Error().Err(err).Msgf("Cannot inspect image from container %s", ctn.ID)
|
||||||
continue
|
continue
|
||||||
} else if local {
|
}
|
||||||
c.logger.Debug().Msgf("Skip locally built image for container %s", ctn.ID)
|
if local := cli.IsLocalImage(imageRaw); local {
|
||||||
|
c.logger.Debug().Msgf("Skip locally built image from container %s", ctn.ID)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if dangling := cli.IsDanglingImage(imageRaw); dangling {
|
||||||
|
c.logger.Debug().Msgf("Skip dangling image from container %s", ctn.ID)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
image, err := provider.ValidateContainerImage(ctn.Image, ctn.Labels, *c.config.WatchByDefault)
|
image, err := provider.ValidateContainerImage(ctn.Image, ctn.Labels, *c.config.WatchByDefault)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error().Err(err).Msgf("Cannot get image from container %s", ctn.ID)
|
c.logger.Error().Err(err).Msgf("Cannot get image from container %s", ctn.ID)
|
||||||
|
|||||||
@@ -29,11 +29,17 @@ func (c *Client) listServiceImage() []model.Image {
|
|||||||
|
|
||||||
var list []model.Image
|
var list []model.Image
|
||||||
for _, svc := range svcs {
|
for _, svc := range svcs {
|
||||||
local, _ := cli.IsLocalImage(svc.Spec.TaskTemplate.ContainerSpec.Image)
|
if imageRaw, err := cli.RawImage(svc.Spec.TaskTemplate.ContainerSpec.Image); err == nil {
|
||||||
if local {
|
if local := cli.IsLocalImage(imageRaw); local {
|
||||||
c.logger.Debug().Msgf("Skip locally built image for service %s", svc.Spec.Name)
|
c.logger.Debug().Msgf("Skip locally built image for service %s", svc.Spec.Name)
|
||||||
continue
|
continue
|
||||||
|
}
|
||||||
|
if dangling := cli.IsDanglingImage(imageRaw); dangling {
|
||||||
|
c.logger.Debug().Msgf("Skip dangling image for service %s", svc.Spec.Name)
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
image, err := provider.ValidateContainerImage(svc.Spec.TaskTemplate.ContainerSpec.Image, svc.Spec.Labels, *c.config.WatchByDefault)
|
image, err := provider.ValidateContainerImage(svc.Spec.TaskTemplate.ContainerSpec.Image, svc.Spec.Labels, *c.config.WatchByDefault)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error().Err(err).Msgf("Cannot get image from service %s", svc.Spec.Name)
|
c.logger.Error().Err(err).Msgf("Cannot get image from service %s", svc.Spec.Name)
|
||||||
|
|||||||
@@ -1,10 +1,21 @@
|
|||||||
package docker
|
package docker
|
||||||
|
|
||||||
// IsLocalImage checks if the image has been built locally
|
import "github.com/docker/docker/api/types"
|
||||||
func (c *Client) IsLocalImage(image string) (bool, error) {
|
|
||||||
raw, _, err := c.API.ImageInspectWithRaw(c.ctx, image)
|
// RawImage returns the image information and its raw representation
|
||||||
if err != nil {
|
func (c *Client) RawImage(image string) (types.ImageInspect, error) {
|
||||||
return false, err
|
imageRaw, _, err := c.API.ImageInspectWithRaw(c.ctx, image)
|
||||||
}
|
return imageRaw, err
|
||||||
return len(raw.RepoDigests) == 0, nil
|
}
|
||||||
|
|
||||||
|
// IsLocalImage checks if the image has been built locally
|
||||||
|
func (c *Client) IsLocalImage(image types.ImageInspect) bool {
|
||||||
|
return len(image.RepoDigests) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsDanglingImage returns whether the given image is "dangling" which means
|
||||||
|
// that there are no repository references to the given image and it has no
|
||||||
|
// child images
|
||||||
|
func (c *Client) IsDanglingImage(image types.ImageInspect) bool {
|
||||||
|
return len(image.RepoTags) == 1 && image.RepoTags[0] == "<none>:<none>" && len(image.RepoDigests) == 1 && image.RepoDigests[0] == "<none>@<none>"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user