docker 清单创建注释并推入脚本
docker manifest create annotate and push in a script
我的项目有 x86_64
的 DockerHub 构建映像。这些图像的命名方式是:myname/project:version_architecture
;比如foo/bar:1.0.0_x86_64
.
然后我在 RPi4 上构建 aarch64
个图像:foo/bar:1.0.0_aarch64
,然后我将其推送到 DockerHub。
现在我想要一个包含它们的清单,这样我就可以在任何地方使用 foo/bar:1.0.0
,而且它会起作用。
AFAIK,以下命令应该有效(在 RPi 上为 运行):
docker build -t foo/bar:1.0.0_aarch64 .
docker push foo/bar:1.0.0_aarch64
docker manifest create foo/bar:1.0.0 foo/bar:1.0.0_aarch64
docker manifest annotate foo/bar:1.0.0 foo/bar:1.0.0_x86_64
docker manifest push foo/bar:1.0.0
但由于某些原因,annotate
步骤有时会失败:
manifest for image foo/bar:1.0.0_x86_64 does not exist in foo/bar:1.0.0
以下解决方法(通常)有效:
docker build -t foo/bar:1.0.0_aarch64 .
docker push foo/bar:1.0.0_aarch64
docker manifest create foo/bar:1.0.0 foo/bar:1.0.0_aarch64
docker manifest annotate foo/bar:1.0.0 foo/bar:1.0.0_x86_64
docker manifest create foo/bar:1.0.0 foo/bar:1.0.0_x86_64 --amend
docker manifest annotate foo/bar:1.0.0 foo/bar:1.0.0_aarch64
docker manifest push foo/bar:1.0.0
我是不是漏掉了什么?
要创建多架构清单,您需要构建 2 个具有不同架构的映像
export ARCH=i386
docker build -t foo/bar:1.0.0-${ARCH}" --build-arg ARCH=${ARCH} --network=host .
docker tag "foo/bar:1.0.0-${ARCH}" "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"
docker push "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"
之后添加另一个图像(从另一个架构构建):
export ARCH=arm64v8
docker build -t foo/bar:1.0.0-${ARCH}" --build-arg ARCH=${ARCH} --network=host .
docker tag "foo/bar:1.0.0-${ARCH}" "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"
docker push "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"
然后您可以创建一个根清单,添加指向实际图像的链接并根据需要进行编辑:
export DOCKER_CLI_EXPERIMENTAL=enabled
docker manifest create "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0" \
--amend "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-i386" \
--amend "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-arm64v8"
docker manifest annotate --arch amd64 "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0" "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-i386"
docker manifest inspect "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0"
docker manifest push "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0"
这允许您拥有带有指向 arch-manifests 链接的根清单。我使用注释来更新图像架构以匹配确切的节点类型。
我的项目有 x86_64
的 DockerHub 构建映像。这些图像的命名方式是:myname/project:version_architecture
;比如foo/bar:1.0.0_x86_64
.
然后我在 RPi4 上构建 aarch64
个图像:foo/bar:1.0.0_aarch64
,然后我将其推送到 DockerHub。
现在我想要一个包含它们的清单,这样我就可以在任何地方使用 foo/bar:1.0.0
,而且它会起作用。
AFAIK,以下命令应该有效(在 RPi 上为 运行):
docker build -t foo/bar:1.0.0_aarch64 .
docker push foo/bar:1.0.0_aarch64
docker manifest create foo/bar:1.0.0 foo/bar:1.0.0_aarch64
docker manifest annotate foo/bar:1.0.0 foo/bar:1.0.0_x86_64
docker manifest push foo/bar:1.0.0
但由于某些原因,annotate
步骤有时会失败:
manifest for image foo/bar:1.0.0_x86_64 does not exist in foo/bar:1.0.0
以下解决方法(通常)有效:
docker build -t foo/bar:1.0.0_aarch64 .
docker push foo/bar:1.0.0_aarch64
docker manifest create foo/bar:1.0.0 foo/bar:1.0.0_aarch64
docker manifest annotate foo/bar:1.0.0 foo/bar:1.0.0_x86_64
docker manifest create foo/bar:1.0.0 foo/bar:1.0.0_x86_64 --amend
docker manifest annotate foo/bar:1.0.0 foo/bar:1.0.0_aarch64
docker manifest push foo/bar:1.0.0
我是不是漏掉了什么?
要创建多架构清单,您需要构建 2 个具有不同架构的映像
export ARCH=i386
docker build -t foo/bar:1.0.0-${ARCH}" --build-arg ARCH=${ARCH} --network=host .
docker tag "foo/bar:1.0.0-${ARCH}" "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"
docker push "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"
之后添加另一个图像(从另一个架构构建):
export ARCH=arm64v8
docker build -t foo/bar:1.0.0-${ARCH}" --build-arg ARCH=${ARCH} --network=host .
docker tag "foo/bar:1.0.0-${ARCH}" "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"
docker push "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-${ARCH}"
然后您可以创建一个根清单,添加指向实际图像的链接并根据需要进行编辑:
export DOCKER_CLI_EXPERIMENTAL=enabled
docker manifest create "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0" \
--amend "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-i386" \
--amend "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-arm64v8"
docker manifest annotate --arch amd64 "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0" "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0-i386"
docker manifest inspect "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0"
docker manifest push "${REGISTRY}.dkr.ecr.${REGION}.amazonaws.com/foo/bar:1.0.0"
这允许您拥有带有指向 arch-manifests 链接的根清单。我使用注释来更新图像架构以匹配确切的节点类型。