我正在使用Jenkins在AWS ECR中推送docker镜像。
当推送图像时,我在ECR repo中提供了标记为$Build_Number.So的图像,我有标记为1、2、3、4的图像。
但是当我试图用Jenkins job的以下命令从EC2中拉出图像时
docker pull 944XXX.dkr.ecr.us-east-1.amazonaws.com/repository1:latest我得到错误,因为没有与标签为最新的图像。
在这里,我想拉取最新的图像(带有标签4),.I不能在这里硬编码标签号,因为docker pull命令将从Jenkins job automatically.So运行,我可以用什么方法拉取最新的图像?
发布于 2019-11-04 22:55:43
我认为这里的正确方法应该是使用不同的标签将相同的图像推送两次。一次推送将包含没有标签的图像,然后第二次推送将是您标记后的同一图像。
请注意,您不必构建两次映像。您只需要发出两次docker push。
ECR足够“聪明”,能够识别图像摘要没有改变,也不会尝试上传两次图像。在第二次推送时,只会将标签发送到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这将导致两个相同的图像,其中只有标签在它们之间进行区分。
发布于 2019-11-04 23:19:04
@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发布于 2019-11-04 22:54:57
如果您想在ECR上添加latest标记,则需要在构建镜像时将其添加并推送到此处。您可以多次使用-t来推送(参见https://docs.docker.com/v17.09/engine/reference/commandline/build/);只需确保将它们全部推送即可。
https://stackoverflow.com/questions/58695853
复制相似问题