我正在创建一个 mongodb docker 镜像,其中包含我的组织主数据库的备份生产数据。但是,当我尝试向上推这个图像时,我遇到了这个错误。
[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'
我的图像大小约为 85gb-100gb,因为其中包含大量数据。 Docker 镜像运行良好,但是当我将其推送到 AWS ECR 时,出现此错误。
我在这里看到了服务限制页面:
https://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html
然而,它的措辞有点令人困惑。我真的没有什么可以在这里做的吗?当然,为了方便起见,我不是唯一想要发布大型 Docker 镜像的人吗?我前进的最佳途径是什么?
谢谢!
最佳答案
您可能应该将数据库内容存储在 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 GB 的图像上也遇到了您在此处描述的各种麻烦(网络故障、超时等,甚至只是将构建上下文复制到 Docker 守护程序中),我想说 Docker 真的只是不适用于任何以 GB 为单位大小的图像。
关于amazon-web-services - 无法将大型 Docker 镜像上传到 AWS ECR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52122812/