Buildx Docker镜像声称是一个清单列表。

3

我正在尝试创建一个Docker清单,以便在Dockerhub上创建一个多平台镜像my-repo/my-image:<some-tag>。同时为两个平台构建不起作用,因为Dockerfile需要挂载已编译二进制文件的tarball。还请注意,我在GitHub Actions CI中使用了AMD64 VM,因此必须进行ARM64交叉编译。

要构建,我使用类似于以下内容的东西:

# Build & push for ARM64; using registry cache since this takes forever to build
docker buildx build . \
    --tag my-repo/my-image-arm64:<some-tag> \
    --platform=linux/arm64 \
    --output type=registry \
    --build-arg tarball_uri=<link-to-arm64-tarball> \
    --cache-to type=registry,ref=my-repo/my-image-cache,mode=max \
    --cache-from type=registry,ref=my-repo/my-image-cache,mode=max

# Build & push for AMD64; a more conventional build
docker buildx build . \
    --tag my-repo/my-image-amd64:<some-tag> \
    --build-arg tarball_uri=<link-to-amd64-tarball>
docker push my-repo/my-image-amd64:<some-tag>

但是,当我运行以下命令时:

docker manifest create my-repo/image-name:<some-tag> \
    my-repo/my-image-amd64:<some-tag> \
    my-repo/my-image-arm64:<some-tag>

我收到了错误信息

docker.io/my-repo/my-image-arm64:<some-tag>是一个清单列表,仅适用于ARM64镜像。通常会创建一个清单列表,但没有my-repo/my-image-arm64:<some-tag>清单。

假设my-repo/my-image-arm64:<some-tag>现在实际上是一个清单列表,我执行以下操作

docker manifest inspect my-repo/my-image-arm64:<some-tag>

但随之而来的是

no such manifest: docker.io/my-repo/my-image-arm64:<some-tag>

这里我做错了什么,有什么想法吗?


你好,你能找到解决方法吗?我遇到了完全相同的错误。谢谢。 - Dnj Abc
是的,至少找到了一个解决方法。 - Beolap
1个回答

4

因此,使用docker manifest的替代方案是运行以下命令,假设my-repo/my-image-arm64:latestmy-repo/my-image-amd64:latest都已推送到您的注册表中:

docker buildx imagetools create -t my-repo/my-image:latest \
    my-repo/my-image-arm64:latest \
    my-repo/my-image-amd64:latest

这也将自动将新的多平台镜像推送到您的注册表(例如Dockerhub)。


1
看起来工作正常。然而,我无法在最终镜像上运行docker manifest,即在您的示例中的my-repo/my-image:latest。Docker pull命令确实会拉取特定架构的镜像,但缺少清单有点令人担忧。在拉取镜像后运行docker inspect <my-repo/my-image:latest>会显示正确的架构。 - Dnj Abc
1
是的,这个解决方案完全忽略了清单的使用。我只能说我的多平台镜像在两个平台上都可以工作。 - Beolap
1
我猜测最近发布的Docker Engine版本破坏了manifest的未记录行为。它被列为实验性功能,可能会受到这种情况的影响。 - John Michelau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接