Не удается загрузить большой образ Docker в AWS ECR

Я работаю над созданием образа докера mongodb, который содержит резервные производственные данные основной базы данных моей организации. Однако, когда я пытаюсь подтолкнуть это изображение, меня встречает эта ошибка.

[root@ip-1-2-3-4 inf-tool-docker-mongo]# docker push 1234567.dkr.ecr.us-east-1.amazonaws.com/inf-data-mongo:2.6-latest
The push refers to repository [1234567.dkr.ecr.us-east-1.amazonaws.com/inf-data-mongo]
e429ba9ffbf8: Pushing [==================================================>]  87.35GB/87.35GB
fbd84d2027f9: Pushing [==================================================>]  87.35GB/87.35GB
4f8f8804b65d: Pushed
140b510fa705: Pushed
a2f3704a5dbf: Pushed
c362c0ad1002: Pushed
16817a92834f: Pushed
5a637bac3303: Pushed
32f938d6fb4c: Pushed
70d8dfa3043e: Pushed
denied: Adding this part to the layer with upload id '1234567890-12345-12345-123456-12345' in the repository with name 'inf-data-mongo' in registry with id '1234567890' exceeds the maximum allowed size of a layer which is '10737418240'

Размер моего образа составляет около 85-100 ГБ, так как в нем много данных. Образ Docker работает нормально, но когда я пытаюсь передать его в AWS ECR, я получаю эту ошибку.

Я видел страницу лимитов обслуживания здесь:

https://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html

Тем не менее, это сформулировано немного запутанно. Неужели я ничего не могу здесь сделать? Наверняка я не единственный, кто хочет отправить большой образ Docker для удобства? Каков мой лучший путь для продвижения вперед?

Спасибо!


person Dan    schedule 31.08.2018    source источник


Ответы (2)


Вероятно, вам следует хранить содержимое базы данных где-нибудь, например, на S3, и отправлять его отдельно от образа базы данных Docker.

Обычно образ Docker содержит только программу, предназначенную для запуска, и если с ней связано постоянное состояние (например, данные базы данных), которое хранится отдельно. Вы запустите свой образ с чем-то вроде

docker run --name mongo -v $PWD/mongo:/data mongo

Как правило, если вы сделали это, вы можете docker stop контейнер, docker rm его, а затем docker run новый контейнер для того же хранилища данных. Если это сработает, то сработает и пересадка данных куда-то еще.

Поэтому я бы предложил рабочий процесс, в котором вы используете немодифицированный образ базы данных и отдельно распространяете его данные. Вы, вероятно, хотели бы иметь загрузочный скрипт, который выглядел бы примерно так:

#!/bin/sh
SNAPSHOT=mongo-snapshot-20180831
if [ ! -d $SNAPSHOT ]; then
  aws s3 cp s3://my-volume/mongo/$SNAPSHOT.tar.gz $SNAPSHOT.tar.gz
  tar xzf $SNAPSHOT.tar.gz
fi
docker run --name mongo -d -p 27017:27017 -v $PWD/$SNAPSHOT:/data mongo:4.1

Когда я пытался работать с очень большими изображениями в прошлом, docker build и docker push на изображениях даже размером 2-4 ГБ сталкивались с проблемами, которые вы здесь описываете (сбои сети, тайм-ауты и т.п., даже просто копируя контекст сборки в демон Docker), и я бы сказал, что Docker действительно просто не работает с любым изображением размером в гигабайты.

person David Maze    schedule 31.08.2018
comment
Хм, я не смог найти каких-либо строгих рекомендаций по работе с большими образами Docker. Можно ли сохранить файл логического тома в S3, а затем смонтировать его в Docker или что-то в этом роде? Распаковка файла *.tar.gz займет целую вечность, а сборка и разборка потребует много места на диске. - person Dan; 01.09.2018

Решение, которое в конечном итоге сработало для моей команды, заключалось в том, чтобы иметь сценарий /entrypoint.sh для контейнера Docker, который запускается как ENTRYPOINT в Dockerfile. Сценарий проверяет, запускается ли образ в контейнере в первый раз, и если это так, он загружает ~90 ГБ файлов баз данных в контейнер локально. Если он уже запускался ранее и имеет файлы, он пропускает этот процесс.

Это идеально, так как наш репозиторий AWS ECR остается тонким, но если разработчику нужна последняя копия производственных данных, у нас есть средства для развертывания образа, который сам настроит необходимые данные с минимальными входными данными.

person Dan    schedule 05.09.2018