我正在创建一个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映像以方便使用的人吗?我前进的最佳途径是什么?
谢谢!
答案 0 :(得分:4)
您可能应该将数据库内容存储在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确实不适用于任何大小为千兆字节的映像。
答案 1 :(得分:0)
最终为我的团队工作的解决方案是为Docker容器创建一个/entrypoint.sh
脚本,该脚本在ENTRYPOINT
中以Dockerfile
的身份运行。该脚本检查以查看映像是否是第一次在容器中运行-如果是,它将在本地将大约90gb的数据库文件拉到容器中。如果它已经运行过并且具有文件,则跳过该过程。
这很完美,因为它可以使我们的AWS ECR存储库保持精简,但是如果开发人员需要最新的生产数据副本,我们可以采用一种方法来部署映像,以最少的输入即可设置必要的数据。