Назад | Перейти на главную страницу

Проблема непрерывного развертывания AWS ECS с CodePipeline

При развертывании ECS с использованием кода, как указано в официальный документ aws, два образа докеров отправляются в ECR. Одно изображение содержит как идентификатор фиксации, так и последний тег, а другое изображение не помечено, как указано ниже.

В "buildspec.yml" файл, который я вижу, докер нажимает два изображения: одно с тегом "последний", а другое - с тегом идентификатора фиксации, как показано ниже

 - 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 должно быть два изображения, одно с "commit id" тег, а другой - с тегом "последний" после завершения отправки докера. Но в ECR он отображается с неправильным именем тега, пожалуйста, проверьте прикрепленное изображение выше. Почему одно изображение отображается без тегов?

2) Почему мне нужно нажать два изображения с идентификатором фиксации и последним тегом, когда в моем определении задачи для создания контейнера используется только последний тег. Разве мне не нужно было нажимать только изображение докера с тегом «последний», зачем мне отправлять изображение с тегом идентификатора фиксации?

Это не имеет ничего общего с ECR. Так работают реестры докеров.

(1) Рассматриваемый код помещает одно и то же изображение с двумя разными тегами, поэтому вполне логично, что вы видите оба latest и <commit-id> теги на одном изображении. MLu правильно предполагает, что у вас было какое-то изображение на ECR, уже помеченное latest. Когда вы отправляете новый образ в реестр докеров, в котором есть старый образ с тем же тегом, что и новый, старый теряет этот тег, а если у него нет других тегов, он становится <untagged>. Это то же поведение тегов, что и на вашем локальном компьютере (docker tag ...).

(2) Если в вашем определении задачи используется только latest отметьте тогда вы не необходимость чтобы поместить оба тега в ECR. Однако в более сложных сценариях, где вы можете хотеть для развертывания образа, который уже был создан ранее (например, в последней сборке есть ошибка, и вы хотите вернуться), это экономит время сборки. Как вы видели в (1), если вы нажмете другое изображение с тегом latest старый станет <untagged> если на нем нет других тегов. В этом случае вы не будете знать, какой образ развернуть. Идентификатор фиксации - это всего лишь один из вариантов, например, вы можете пометить свои изображения датой или версией.

Вы уверены, что обе строки из одного и того же 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}

Надеюсь, это поможет :)