Buildx Docker 镜像声称是清单列表

问题描述 投票:0回答:2

我正在尝试创建 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 multiplatform buildx
2个回答
4
投票

因此,使用

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)。


0
投票

遗憾的是,我无法给出答案,因为我也遇到了这个问题,但我至少可以深入了解正在发生的事情。

当使用 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"
         }
      }
   ]
}

如果我找到解决此问题的方法,我一定会更新我的回复。

© www.soinside.com 2019 - 2024. All rights reserved.