Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
docker清单创建注释并推入脚本_Docker_Docker Registry_Multiarch - Fatal编程技术网

docker清单创建注释并推入脚本

docker清单创建注释并推入脚本,docker,docker-registry,multiarch,Docker,Docker Registry,Multiarch,我为我的项目提供了用于x86_64的DockerHub构建映像。这些图像有这样的命名:myname/project:version_architecture;例如foo/bar:1.0.0\u x86\u 64 然后我在RPi4:foo/bar:1.0.0aarch64上构建aarch64图像,然后将其推送到DockerHub 现在我想要一个包含这两个元素的清单,这样我就可以在任何地方使用foo/bar:1.0.0,并且它可以工作 好的,以下命令应该可以工作(在RPi上运行): 但由于某些原因,

我为我的项目提供了用于x86_64的DockerHub构建映像。这些图像有这样的命名:
myname/project:version_architecture
;例如
foo/bar:1.0.0\u x86\u 64

然后我在RPi4:
foo/bar:1.0.0aarch64
上构建
aarch64
图像,然后将其推送到DockerHub

现在我想要一个包含这两个元素的清单,这样我就可以在任何地方使用
foo/bar:1.0.0
,并且它可以工作

好的,以下命令应该可以工作(在RPi上运行):

但由于某些原因,
注释
步骤有时会失败:

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

我遗漏了什么吗?

要创建多拱门清单,您需要使用不同的拱门构建两个图像

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 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清单的链接。我使用annotate来更新图像架构,以匹配精确的节点类型

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"