Skip to content

Commit 09b876a

Browse files
ratak8s-infra-cherrypick-robot
authored andcommitted
integration: Fix TestImageLoad() failure on CI
If docker in the host is configured to use the containerd image format, then the docker pull/save commands above download the multi-platform image. IOW, the index.json has references to the other platforms SHAs. This references to things that are not present (the artifacts for other platforms) is what make `ctr` fail. However, if we specify a platform, then ctr ignores the other platforms and the import works just fine. To try this locally, you can: $ docker pull ghcr.io/containerd/busybox:1.36 $ docker save ghcr.io/containerd/busybox:1.36 -o image.tar $ ctr images import --local=true image.tar The last command will fail if you are using the containerd image store in docker. If you specify the platform with --platform, it works fine. With docker overlayfs2 storage driver, if you untar the image you get only things relevant for your platform: ``` $ cat index.json | jq { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.index.v1+json", "manifests": [ { "mediaType": "application/vnd.oci.image.manifest.v1+json", "digest": "sha256:4d6b13f2ddbe87da8d9dee3719df1723a6d768e511802e70d42ab15370c6eb24", "size": 401, "annotations": { "io.containerd.image.name": "ghcr.io/containerd/busybox:1.36", "org.opencontainers.image.ref.name": "1.36" } } ] } $ cat blobs/sha256/4d6b13f2ddbe87da8d9dee3719df1723a6d768e511802e70d42ab15370c6eb24 | jq { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.manifest.v1+json", "config": { "mediaType": "application/vnd.oci.image.config.v1+json", "digest": "sha256:66ba00ad3de8677a3fa4bc4ea0fc46ebca0f14db46ca365e7f60833068dd0148", "size": 1457 }, "layers": [ { "mediaType": "application/vnd.oci.image.layer.v1.tar", "digest": "sha256:b64792c17e4ad443d16b218afb3a8f5d03ca0f4ec49b11c1a7aebe17f6c3c1d2", "size": 5096448 } ] } ``` But with the other you get for lot of other platforms too: ``` $ cat index.json | jq { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.index.v1+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "digest": "sha256:7b3ccabffc97de872a30dfd234fd972a66d247c8cfc69b0550f276481852627c", "size": 2295, "annotations": { "containerd.io/distribution.source.ghcr.io": "containerd/busybox", "io.containerd.image.name": "ghcr.io/containerd/busybox:1.36", "org.opencontainers.image.ref.name": "1.36" } } ] } $ cat blobs/sha256/7b3ccabffc97de872a30dfd234fd972a66d247c8cfc69b0550f276481852627c | jq { "manifests": [ { "digest": "sha256:907ca53d7e2947e849b839b1cd258c98fd3916c60f2e6e70c30edbf741ab6754", "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "platform": { "architecture": "amd64", "os": "linux" }, "size": 528 }, { "digest": "sha256:dde8e930c7b6a490f728e66292bc9bce42efc9bbb5278bae40e4f30f6e00fe8c", "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "platform": { "architecture": "arm", "os": "linux", "variant": "v5" }, "size": 528 }, { ... ``` You can switch to the containerd snapshotter in docker by adding this to the daemon.json: ``` { "features": { "containerd-snapshotter": true } } ``` Signed-off-by: Rodrigo Campos <[email protected]>
1 parent 992e0ee commit 09b876a

1 file changed

Lines changed: 8 additions & 1 deletion

File tree

integration/image_load_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,15 @@ func TestImageLoad(t *testing.T) {
6767
require.NoError(t, err, "ctr should be installed, make sure you've run `make install-deps`")
6868
// Add --local=true option since currently the transfer service
6969
// does not provide enough progress to avoid timeout
70+
// and --platform to only check for manifests for this platform. The "ctr image import"
71+
// command otherwise might fail, if the the above docker commands use the containerd image
72+
// store, as in that case `docker save` produces OCI artifacts referencing manifests for
73+
// other platforms that are not included in what we downloaded. By specifying a platform, we
74+
// just ignore the references to other platforms.
75+
platform := "--platform=" + goruntime.GOOS + "/" + goruntime.GOARCH
7076
output, err = exec.Command(ctr, "-address="+containerdEndpoint,
71-
"-n=k8s.io", "images", "import", "--local=true", tar).CombinedOutput()
77+
"-n=k8s.io", "images", "import", "--local=true",
78+
platform, tar).CombinedOutput()
7279
require.NoError(t, err, "output: %q", output)
7380

7481
t.Logf("make sure image is loaded")

0 commit comments

Comments
 (0)