Не удается загрузить большое изображение 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 для удобства? Какой мой лучший путь для продвижения вперед?
Спасибо!
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 действительно просто не работает с изображениями размером в гигабайты.
Решение, которое закончилось работой для моей команды, состояло в том, чтобы иметь /entrypoint.sh
скрипт для контейнера Docker, который запускается как ENTRYPOINT
в Dockerfile
, Сценарий проверяет, запускается ли изображение в первый раз в контейнере - если это так, он локально вытягивает ~90 ГБ файлов баз данных в контейнер. Если он уже запускался раньше и имеет файлы, он пропускает этот процесс.
Это идеально, так как сохраняет репозитарий AWS ECR тонким, но если разработчику требуется последняя копия производственных данных, у нас есть средства для развертывания образа, который будет содержать необходимые данные с минимальными затратами.