Вопрос или проблема
Новые образы с тем же тегом не отправляются в ECR. Первоначальная загрузка образа в ECR, похоже, работает, но если я пытаюсь создать последующий билд, я получаю сообщение “Слой уже существует”, и ничего не меняется, хотя кэш Docker на локальной машине обновлен.
У меня включена опция –no-cache при сборке Docker:
docker build --no-cache --target eks -t ${aws_account_id}.dkr.ecr.${aws_region}.amazonaws.com/${ecr_repo}:${build_tag}
Сборка на моем сервере сборки содержит обновленный код.
docker push ${aws_account_id}.dkr.ecr.${aws_region}.amazonaws.com/${ecr_repo}:${build_tag}
результат:
5f70bf18a086: Слой уже существует
29f76733b608: Слой уже существует
39dc6106a950: Слой уже существует
c2e8b623318e: Слой уже существует
2aeae0baeff6: Слой уже существует
b90b75df0e47: Слой уже существует
1e62d68319d5: Слой уже существует
e96ceb5f9545: Слой уже существует
deafb97bd25e: Слой уже существует
af7a2ab75583: Слой уже существует
150fc640e164: Слой уже существует
89442d8a6d4e: Слой уже существует
ecd0c1bc8d94: Слой уже существует
c37a8863d35e: Слой уже существует
7f0175a09165: Слой уже существует
9ea571566ff7: Слой уже существует
8d6551b23d41: Слой уже существует
8badcfdd9076: Слой уже существует
Несмотря на это, код в ECR не обновляется, последующие пересборки с тем же тегом сталкиваются с той же проблемой. Новые теги, похоже, не имеют значения, удаление образа из ECR ничего не меняет, проблема та же. Единственный способ это исправить — перейти на совершенно новый ECR, но затем последующие пересборки сталкиваются с той же проблемой. Все это работало нормально в течение нескольких недель, но вдруг началось это.
Если я запускаю контейнер Docker на сервере сборки, используя:
docker run -it <идентификатор образа> bash
Я вижу, что он актуален, но когда этот тегированный образ загружается в ECR, загружается более старая версия, которая не содержит последнего Docker push.
Эта тема в основном такая же проблема, ответов от Amazon не было: https://repost.aws/questions/QUwkv1zCjuQHOvTmzPgVqEVg/ecr-is-not-deleting-images-how-to-force-layer-upload
Любые советы будут очень полезны.
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, что Amazon ECR использует кэширование слоев изображений, что может вызвать ситуацию, когда, даже если локальная сборка изменена, ECR не считает слои новыми и не обновляет их. Вот несколько рекомендаций по решению вашей проблемы:
-
Используйте уникальные теги для каждого нового изображения: Важно понимать, что если вы пытаетесь загрузить изображение с уже существующим тегом, даже если содержимое изображения изменилось, ECR не заменит существующие слои, что приводит к ошибке "Layer already exists". Попробуйте использовать временные метки или хэши коммита в качестве тегов при загрузке новых изображений.
docker tag <local_image_id> ${aws_account_id}.dkr.ecr.${aws_region}.amazonaws.com/${ecr_repo}:${new_unique_tag} docker push ${aws_account_id}.dkr.ecr.${aws_region}.amazonaws.com/${ecr_repo}:${new_unique_tag}
-
Проверьте изменения в Dockerfile: Убедитесь, что ваш
Dockerfile
действительно приводит к изменению слоев. Например, если команды в Dockerfile не изменились, ECR может не считать слои новыми. Попробуйте внести небольшие изменения вDockerfile
, чтобы "затронуть" слои. Например, добавление комментария или изменение порядка команд может помочь. -
Удаление ненужных слоев: Если вам нужно принудительно обновить изображение, вы можете удалить кешированные слои в вашем локальном Docker. Команда
docker builder prune
поможет вам очистить кеш. После этого повторите сборку и загрузку:docker builder prune docker build --no-cache --target eks -t ${aws_account_id}.dkr.ecr.${aws_region}.amazonaws.com/${ecr_repo}:${build_tag} docker push ${aws_account_id}.dkr.ecr.${aws_region}.amazonaws.com/${ecr_repo}:${build_tag}
-
Отладка с помощью
docker inspect
: Проверьте детали изображения и слоев с помощью командыdocker inspect <image_id>
. Убедитесь, что все слои, которые должны были измениться, действительно имеют новое содержимое. -
Создание нового репозитория как временное решение: Как вы уже предпринимали, создание нового репозитория в ECR может помочь в случае, если предыдущий репозиторий продолжает выдавать проблемы. Но это лишь временный обходной путь.
-
Контакт с поддержкой AWS: Если проблема сохраняется даже после выполнения вышеуказанных шагов, рекомендуется обратиться в службу поддержки AWS. У них есть возможность предоставить более детальную информацию о вашей учетной записи и возможных системных проблемах.
Надеюсь, эти шаги помогут решить вашу проблему с загрузкой изображений в Amazon ECR.