Amazon ECR “Слой уже существует”, есть ли способ заставить ECR обновиться?

Вопрос или проблема

Новые образы с тем же тегом не отправляются в 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 не считает слои новыми и не обновляет их. Вот несколько рекомендаций по решению вашей проблемы:

  1. Используйте уникальные теги для каждого нового изображения: Важно понимать, что если вы пытаетесь загрузить изображение с уже существующим тегом, даже если содержимое изображения изменилось, 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}
  2. Проверьте изменения в Dockerfile: Убедитесь, что ваш Dockerfile действительно приводит к изменению слоев. Например, если команды в Dockerfile не изменились, ECR может не считать слои новыми. Попробуйте внести небольшие изменения в Dockerfile, чтобы "затронуть" слои. Например, добавление комментария или изменение порядка команд может помочь.

  3. Удаление ненужных слоев: Если вам нужно принудительно обновить изображение, вы можете удалить кешированные слои в вашем локальном 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}
  4. Отладка с помощью docker inspect: Проверьте детали изображения и слоев с помощью команды docker inspect <image_id>. Убедитесь, что все слои, которые должны были измениться, действительно имеют новое содержимое.

  5. Создание нового репозитория как временное решение: Как вы уже предпринимали, создание нового репозитория в ECR может помочь в случае, если предыдущий репозиторий продолжает выдавать проблемы. Но это лишь временный обходной путь.

  6. Контакт с поддержкой AWS: Если проблема сохраняется даже после выполнения вышеуказанных шагов, рекомендуется обратиться в службу поддержки AWS. У них есть возможность предоставить более детальную информацию о вашей учетной записи и возможных системных проблемах.

Надеюсь, эти шаги помогут решить вашу проблему с загрузкой изображений в Amazon ECR.

Оцените материал
Добавить комментарий

Капча загружается...