Docker ECR 中的图像标记
Docker Image tagging in ECR
我正在使用 Jenkins 在 AWS ECR 中推送 docker 图像。
在推送图像时,我提供的标签为 $Build_Number。所以在 ECR 回购中我有带有标签的图像 1,2,3,4.
但是当我尝试使用 Jenkins 作业中的以下命令从 EC2 中提取图像时
docker pull 944XXX.dkr.ecr.us-east-1.amazonaws.com/repository1:latest
我收到错误消息,因为没有带有最新标签的图像。
这里我想拉取最新的镜像(标签为4)。我不能在这里硬编码标签号,因为 docker pull 命令会自动从 Jenkins 作业中 运行。那么有什么方法可以拉取最新的镜像呢?
如果你想在 ECR 上添加一个 latest
标签,你需要在构建镜像时添加并推送它。您可以多次使用 -t
到 docker build
(参见 https://docs.docker.com/v17.09/engine/reference/commandline/build/);只要确保将它们全部推送即可。
我认为这里正确的方法是使用不同的标签将同一张图片推送两次。一次推送将包含没有标签的图像,然后第二次推送将是您标记后的相同图像。
请注意,您不必两次构建映像。您只需发出 docker push
两次。
ECR "smart" 足以识别图像摘要没有改变,它不会尝试实际上传图像两次。在第二次推送时,只有标签会被发送到 ECR。
现在你有一个未标记版本和一个标记版本,你可以拉取没有标记规范的图像,你将得到 :latest
图像。 Here is a reference to the AWS docs 他们提到如果用户没有发送标签,将添加 :latest
标签。
流程看起来像这样:
# Build the image
docker build -f ./Dockerfile -t my-web-app
# Push the untagged image (will become the ":latest")
docker push my-web-app
# Tag the image with your build_number
docker tag my-web-app my-web-app:build_number
# Push the tagged image
docker push my-web-app:build_number
您现在可以:
docker pull my-web-app:build_number
docker pull my-web-app
这将产生 2 个相同的图像,只有标签区分它们。
@Lix 建议您尝试一个解决方案,或者如果您只对最新推送的图像感兴趣,而不管最新图像的标签是什么,您都可以从 AWS-CLI 获取最新图像。
因此您的 Jenkins 作业命令将是
TAG=$(aws ecr describe-images --output json --repository-name stage/redis --query 'sort_by(imageDetails,& imagePushedAt)[-1].imageTags[0]' | jq . --raw-output)
docker pull 944XXX.dkr.ecr.us-east-1.amazonaws.com/repository1:$TAG
我正在使用 Jenkins 在 AWS ECR 中推送 docker 图像。
在推送图像时,我提供的标签为 $Build_Number。所以在 ECR 回购中我有带有标签的图像 1,2,3,4.
但是当我尝试使用 Jenkins 作业中的以下命令从 EC2 中提取图像时
docker pull 944XXX.dkr.ecr.us-east-1.amazonaws.com/repository1:latest
我收到错误消息,因为没有带有最新标签的图像。
这里我想拉取最新的镜像(标签为4)。我不能在这里硬编码标签号,因为 docker pull 命令会自动从 Jenkins 作业中 运行。那么有什么方法可以拉取最新的镜像呢?
如果你想在 ECR 上添加一个 latest
标签,你需要在构建镜像时添加并推送它。您可以多次使用 -t
到 docker build
(参见 https://docs.docker.com/v17.09/engine/reference/commandline/build/);只要确保将它们全部推送即可。
我认为这里正确的方法是使用不同的标签将同一张图片推送两次。一次推送将包含没有标签的图像,然后第二次推送将是您标记后的相同图像。
请注意,您不必两次构建映像。您只需发出 docker push
两次。
ECR "smart" 足以识别图像摘要没有改变,它不会尝试实际上传图像两次。在第二次推送时,只有标签会被发送到 ECR。
现在你有一个未标记版本和一个标记版本,你可以拉取没有标记规范的图像,你将得到 :latest
图像。 Here is a reference to the AWS docs 他们提到如果用户没有发送标签,将添加 :latest
标签。
流程看起来像这样:
# Build the image
docker build -f ./Dockerfile -t my-web-app
# Push the untagged image (will become the ":latest")
docker push my-web-app
# Tag the image with your build_number
docker tag my-web-app my-web-app:build_number
# Push the tagged image
docker push my-web-app:build_number
您现在可以:
docker pull my-web-app:build_number
docker pull my-web-app
这将产生 2 个相同的图像,只有标签区分它们。
@Lix 建议您尝试一个解决方案,或者如果您只对最新推送的图像感兴趣,而不管最新图像的标签是什么,您都可以从 AWS-CLI 获取最新图像。
因此您的 Jenkins 作业命令将是
TAG=$(aws ecr describe-images --output json --repository-name stage/redis --query 'sort_by(imageDetails,& imagePushedAt)[-1].imageTags[0]' | jq . --raw-output)
docker pull 944XXX.dkr.ecr.us-east-1.amazonaws.com/repository1:$TAG