From 01cb602ed2db82793b56c639c487afa8acbc5e84 Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Sun, 22 Dec 2019 19:04:56 +0100 Subject: [PATCH] Skip analysis on locally built image --- internal/provider/docker/container.go | 8 ++++++++ internal/provider/swarm/service.go | 8 ++++++++ pkg/docker/image.go | 28 +++++---------------------- pkg/docker/registry.go | 21 ++++++++++++++++++++ 4 files changed, 42 insertions(+), 23 deletions(-) diff --git a/internal/provider/docker/container.go b/internal/provider/docker/container.go index 9a392d2f..5f74be9d 100644 --- a/internal/provider/docker/container.go +++ b/internal/provider/docker/container.go @@ -37,6 +37,14 @@ func (c *Client) listContainerImage(id string, elt model.PrdDocker) []model.Imag var list []model.Image for _, ctn := range ctns { + local, err := cli.IsLocalImage(ctn.Image) + if err != nil { + sublog.Error().Err(err).Msgf("Cannot inspect image from container %s", ctn.ID) + continue + } else if local { + sublog.Debug().Msgf("Skip locally built image for container %s", ctn.ID) + continue + } image, err := provider.ValidateContainerImage(ctn.Image, ctn.Labels, elt.WatchByDefault) if err != nil { sublog.Error().Err(err).Msgf("Cannot get image from container %s", ctn.ID) diff --git a/internal/provider/swarm/service.go b/internal/provider/swarm/service.go index 3764d269..edbdfc56 100644 --- a/internal/provider/swarm/service.go +++ b/internal/provider/swarm/service.go @@ -30,6 +30,14 @@ func (c *Client) listServiceImage(id string, elt model.PrdSwarm) []model.Image { var list []model.Image for _, svc := range svcs { + local, err := cli.IsLocalImage(svc.Spec.TaskTemplate.ContainerSpec.Image) + if err != nil { + sublog.Error().Err(err).Msgf("Cannot inspect image from service %s", svc.ID) + continue + } else if local { + sublog.Debug().Msgf("Skip locally built image for service %s", svc.ID) + continue + } image, err := provider.ValidateContainerImage(svc.Spec.TaskTemplate.ContainerSpec.Image, svc.Spec.Labels, elt.WatchByDefault) if err != nil { sublog.Error().Err(err).Msgf("Cannot get image from service %s", svc.ID) diff --git a/pkg/docker/image.go b/pkg/docker/image.go index bbf79f2a..4bd9a464 100644 --- a/pkg/docker/image.go +++ b/pkg/docker/image.go @@ -1,28 +1,10 @@ package docker -import ( - "context" - "fmt" - "strings" - - "github.com/containers/image/docker" - "github.com/containers/image/types" -) - -func (c *RegistryClient) newImage(ctx context.Context, imageStr string) (types.ImageCloser, error) { - if !strings.HasPrefix(imageStr, "//") { - imageStr = fmt.Sprintf("//%s", imageStr) - } - - ref, err := docker.ParseReference(imageStr) +// IsLocalImage checks if the image has been built locally +func (c *Client) IsLocalImage(image string) (bool, error) { + raw, _, err := c.API.ImageInspectWithRaw(c.ctx, image) if err != nil { - return nil, fmt.Errorf("invalid image name %s: %v", imageStr, err) + return false, err } - - img, err := ref.NewImage(ctx, c.sysCtx) - if err != nil { - return nil, err - } - - return img, nil + return len(raw.RepoDigests) == 0, nil } diff --git a/pkg/docker/registry.go b/pkg/docker/registry.go index 6c774218..d7008711 100644 --- a/pkg/docker/registry.go +++ b/pkg/docker/registry.go @@ -2,8 +2,11 @@ package docker import ( "context" + "fmt" + "strings" "time" + "github.com/containers/image/docker" "github.com/containers/image/types" ) @@ -56,3 +59,21 @@ func (c *RegistryClient) timeoutContext() (context.Context, context.CancelFunc) } return ctx, cancel } + +func (c *RegistryClient) newImage(ctx context.Context, imageStr string) (types.ImageCloser, error) { + if !strings.HasPrefix(imageStr, "//") { + imageStr = fmt.Sprintf("//%s", imageStr) + } + + ref, err := docker.ParseReference(imageStr) + if err != nil { + return nil, fmt.Errorf("invalid image name %s: %v", imageStr, err) + } + + img, err := ref.NewImage(ctx, c.sysCtx) + if err != nil { + return nil, err + } + + return img, nil +}