当ECS任务定义中已有CodePipeline时,为什么它需要`imagedefinitions.json`?

时间:2019-10-17 06:43:17

标签: amazon-ecs aws-code-deploy aws-codepipeline

好的,所以我有一个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的一些基础知识。

2 个答案:

答案 0 :(得分:1)

您很有意思,但是在生产系统中使用“:latest”标识/检索图像通常不是一个好主意,主要是因为标签的不确定性并可能导致意外。互联网上有很多文章讨论了这种反模式,例如[1]。

为回答您的问题,“ imagedefinitions.json”的想法是在任务定义中标识容器的更新图像。并非一直都在使用':latest'标记。

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

答案 1 :(得分:0)

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