我成功地使用codebuild和codepipeline连续部署到多个项目的ECS上,但是出现了问题。 在此项目中,我需要将相同的构建部署到四个不同的ECS容器。
我使用codebuild和codepipeline CD的默认方式如aws docs所示-我在生成过程结束时创建了imagedefinitions.json文件。 据我所知,该文件只能包含一个ECS容器的定义。
您必须提供容器的名称:
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker images...
- docker push $REPOSITORY_URI:latest
- docker push $REPOSITORY_URI:$IMAGE_TAG
- echo Writing image definitions file...
- printf '[{"name":"hello-world","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
files: imagedefinitions.json
对于此任务定义:
{
"taskDefinition": {
"family": "hello-world",
"containerDefinitions": [
{
"name": "hello-world",
"image": "012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world:6a57b99",
"cpu": 100,
"portMappings": [
{
"protocol": "tcp",
"containerPort": 80,
"hostPort": 80
}
],
"memory": 128,
"essential": true
}
]
如果我将不同服务中的所有四个容器的名称更改为相同的名称,它可以工作。例如特定的图像名称。但是我不知道这是一个好主意。
现在,我想知道我是否可以在此项目中完全使用代码管道将ECS用于ECS,还是应该以其他方式进行部署。
答案 0 :(得分:1)
codePipeline中的CodeBuild操作当前仅支持一个输出工件。您可以将所有图像定义文件压缩到一个zip文件中,并添加一个lambda调用操作,将其拆分为多个工件,并在ECS部署操作中使用它们。
答案 1 :(得分:0)
您可以构建文件以在 imagedefinitions.json 文件中列出多个容器-图像对,如下所示:
[{
"name": "simple-app",
"imageUri": "httpd:2.4"
},
{
"name": "simple-app",
"imageUri": "mysql"
},
{
"name": "simple-app-2",
"imageUri": "java1.8"
}]
以下是在我的buildspec.yml文件中如何完成此操作的示例:
post_build:
commands:
- docker push $IMAGE1_URI:$IMAGE_TAG
- docker push $IMAGE2_URI:$IMAGE_TAG
- printf '[{"name":"conatiner1_name","imageUri":"%s"}, {"name":"container2_name","imageUri":"%s"}]' $IMAGE1_URI:$IMAGE_TAG $IMAGE2_URI:$IMAGE_TAG > imagedefinitions.json