Не удается загрузить большое изображение Docker в AWS ECR - PullRequest
0 голосов
/ 01 сентября 2018

Я работаю над созданием образа докера 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 ]

0 голосов
/ 05 сентября 2018

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

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

0 голосов
/ 01 сентября 2018

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

...