Я успешно использую codebuild и codepipeline для непрерывного развертывания на ECS для нескольких проектов, но у меня возникла проблема. В этом проекте мне нужно развернуть ту же сборку на четыре разных контейнера ECS.
По умолчанию я использую codebuild и codepipeline CD, как показано в документации aws - я создаю файл 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
}
]
мог сработает, если я изменю имена всех четырех контейнеров в разных сервисах на одно и то же. например, это конкретное имя изображения. Но я не могу сказать, хорошая ли это идея.
Теперь мне интересно, могу ли я вообще использовать codepipeline для ECS в этом проекте или мне следует развернуть его другим способом.
Я использую одно изображение ECR. Я переношу наш компакт-диск на aws, поэтому система уже работает, и в настоящее время каждая служба, использующая один и тот же образ, имеет другое имя для контейнера. Я не уверен, почему бы мне просто не изменить имя контейнера на это имя изображения.
на самом деле не имеет значения, есть ли у вас одно и то же имя контейнера в разных службах.
Действие CodeBuild в codePipeline в настоящее время поддерживает только один выходной артефакт. Вы можете заархивировать все файлы определения изображения в один zip-файл и добавить действие вызова лямбда-выражения, чтобы разделить его на несколько артефактов и использовать их в действиях развертывания ECS.
Вы можете создать файл для перечисления нескольких пар контейнер-образ в файле 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
Подробнее здесь: https://docs.aws.amazon.com/codepipeline/latest/userguide/file-reference.html#pipelines-create-image-definitions
почему бы вам не использовать единый репозиторий ECR / единый образ для сервисов?