При развертывании 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}
Надеюсь, это поможет :)