我正在尝试创建 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> is a manifest list
,仅适用于 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>
对我在这里做错了什么有什么想法吗?
因此,使用
docker manifest
的替代解决方案是运行以下命令,假设 my-repo/my-image-arm64:latest
和 my-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)。
遗憾的是,我无法给出答案,因为我也遇到了这个问题,但我至少可以深入了解正在发生的事情。
当使用 buildx 并在目标架构后应用
--platform
标志时,即使我们只指定一种架构,buildx 也会自动为图像创建清单列表。要验证这一点,您可以对刚刚创建的图像使用 docker manifest inspect
命令,您将看到类似以下内容:
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.index.v1+json",
"manifests": [
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 1059,
"digest": "sha256:7f79d684251feb3981eac2b295fecda741c3a1d743bdf0ba6256254b06ad0ce3",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 566,
"digest": "sha256:0825f2a2d968c80f06fbc91f1d1c1cf46a4049186fa33bb00507943d5f0b136a",
"platform": {
"architecture": "unknown",
"os": "unknown"
}
}
]
}
如果我找到解决此问题的方法,我一定会更新我的回复。