为什么 CodePipeline 需要 `imagedefinitions.json` 而 ECS 任务定义已经有了这个?

Why does CodePipeline require an `imagedefinitions.json` when ECS task definitions already have this?

好的,所以我有一个 CodePipeline,它的功能非常普通

CodeCommit -> Build Docker images -> CodeDeploy to ECS

buildspec.yml 文件中,AWS requires outputting imagedefinitions.json 作为 CodePipeline 可用于将容器名称映射到 ECR 映像的工件 URL。

这是在您的 buildspec.yml 中经常引用的如何执行此操作的示例:

printf '[{"name":"MyService","imageUri":"%s"}]' $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/myservice/app:latest > imagedefinitions.json

但这对我来说似乎完全多余。在 ECS 任务定义中,我们可以在 containerDefinitions 下包含以下内容:

"containerDefinitions": [
    {
      "name": "MyService",
      "image": "123456789.dkr.ecr.us-east-1.amazonaws.com/myservice/app:latest"
     }, 
     ...
]

为什么要使用CodePipeline CodeDeploy ECS任务,必须提供ECS任务定义中已经指定的信息?在这里消除对工件(以及存储所述工件的 S3 存储桶)的需求会更加清晰!

可能有些基础知识CodeDeploy/ECS没看懂

你的观点很好,但是在生产系统中使用“:latest”来处理 identify/retrieve 图像通常不是一个好主意,主要是因为标签不是确定性的,可能会导致意外。互联网上有很多文章讨论这种反模式,例如[1].

为了回答您的问题,"imagedefinitions.json" 的想法是在任务定义中识别容器的更新图像。它不打算一直使用“:latest”标签。

[1] https://vsupalov.com/docker-latest-tag/

printf '[{"name":"MyService","imageUri":"%s"}]' MyService 的名称是什么?