From cb8f36adf39a740af7aa29a68a08b2111e9b449f Mon Sep 17 00:00:00 2001 From: Christoph Ostarek Date: Tue, 27 Aug 2024 15:49:17 +0200 Subject: [PATCH] moby: check architecture for docker image under certain cases the container image is already in the local docker registry, but with the wrong architecture; in this case just pretend it is not there and let the caller decide if they want to build it Signed-off-by: Christoph Ostarek --- src/cmd/linuxkit/docker/cmd.go | 11 +++++++++-- src/cmd/linuxkit/moby/build/images.go | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/cmd/linuxkit/docker/cmd.go b/src/cmd/linuxkit/docker/cmd.go index 644f7dfae..005ffb432 100644 --- a/src/cmd/linuxkit/docker/cmd.go +++ b/src/cmd/linuxkit/docker/cmd.go @@ -3,6 +3,7 @@ package docker import ( "context" "errors" + "fmt" "io" "os" "sync" @@ -51,13 +52,19 @@ func createClient() (*client.Client, error) { } // HasImage check if the provided ref is available in the docker cache. -func HasImage(ref *reference.Spec) error { +func HasImage(ref *reference.Spec, architecture string) error { log.Debugf("docker inspect image: %s", ref) cli, err := Client() if err != nil { return err } - _, err = InspectImage(cli, ref) + imageInspect, err := InspectImage(cli, ref) + if err != nil { + return err + } + if imageInspect.Architecture != "" && imageInspect.Architecture != architecture { + return fmt.Errorf("image not found for right architecture (%s != %s)", imageInspect.Architecture, architecture) + } return err } diff --git a/src/cmd/linuxkit/moby/build/images.go b/src/cmd/linuxkit/moby/build/images.go index 8b5a72da2..6b7d23fba 100644 --- a/src/cmd/linuxkit/moby/build/images.go +++ b/src/cmd/linuxkit/moby/build/images.go @@ -18,7 +18,7 @@ func imagePull(ref *reference.Spec, alwaysPull bool, cacheDir string, dockerCach // - !alwaysPull && !dockerCache: try linuxkit cache, then try to pull from registry, then fail // first, try docker, if that is available if !alwaysPull && dockerCache { - if err := docker.HasImage(ref); err == nil { + if err := docker.HasImage(ref, architecture); err == nil { return docker.NewSource(ref), nil } // docker is not required, so any error - image not available, no docker, whatever - just gets ignored