CodePipeline 的 AWS ECS 持续部署问题

CodePipeline 的 AWS ECS 持续部署问题

使用 codepipeline 部署 ECS 时,如aws官方文档,两个 docker 镜像正在推送到 ECR。一个镜像包含提交 ID 和最新标记,另一个镜像未加标记,如下图所示。

在此处输入图片描述

"buildspec.yml"文件中我可以看到,docker 正在推送两个图像,一个带有“最新标签,另一个带有提交 id 标签,如下所示

 - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
 - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
 - IMAGE_TAG=${COMMIT_HASH:=latest}
 - docker push $REPOSITORY_URI:latest
 - docker push $REPOSITORY_URI:$IMAGE_TAG

我的问题是

1) 在 ECR 中,docker push 完成后,必须有两个图像,一个带有"commit id"标签,另一个带有“最新”标签。但在 ECR 中,它显示的标签名称错误,请检查上面附加的图像。为什么一个图像显示未标记?

2) 当我的任务定义仅使用最新标记来构建容器时,为什么我需要推送具有提交 ID 和最新标记的两个映像。 我不是只需要推送带有“最新”标记的 docker 映像吗,为什么我需要推送带有提交 ID 标记的映像?

答案1

你确定这两行来自同一条线路吗docker push?我认为发生的情况是第二行是你的上一行:latest,当你推送新的时,:latest上一行就变得没有标签了。

检查 CodeBuild 脚本输出以验证您是否确实运行了两次推送,一次使用:latest,一次使用:${COMMIT_HASH}。另外,我相信您必须tag在推送到 ECR 之前在本地使用两个修订版的图像。但我还没有检查过这个……

这就是我们所做的(我们的${IMAGE_ID}包含:${REVISION})...

docker tag ${IMAGE_ID} ${ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_ID}
docker push ${ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_ID}

希望有帮助:)

答案2

这与 ECR 无关。这只是 Docker 注册表的工作方式。

(1) 有问题的代码推送了带有两个不同标签的同一镜像,因此您在同一镜像上看到latest和标签是完全合理的。MLu 正确地指出了您在 ECR 上已经标记了 的一些镜像。当您将新镜像推送到具有与新镜像具有相同标签的旧镜像的 docker 注册表时,旧镜像将丢失此标签,如果它没有其他标签,它将变为。它与本地机器上的标记行为相同()。<commit-id>latest<untagged>docker tag ...

(2)如果你的任务定义只使用latest标签,那么你不需要需要将两个标签推送到 ECR。但在更复杂的场景中,您可能部署之前已经构建的镜像(例如最新版本有错误并且您想要恢复),它可以节省构建时间。正如您在 (1) 中看到的那样,如果您推送带有标签的不同镜像,则如果旧镜像上没有任何其他标签,则latest旧镜像将变成新镜像<untagged>。在这种情况下,您将不知道要部署哪个镜像。提交 ID 只是一个选项,例如,您可能希望使用日期或版本标记您的镜像。

相关内容