3

我正在创建一个 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 映像的人吗?我前进的最佳途径是什么?

谢谢!

4

2 回答 2

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 真的只是不适用于任何千兆字节大小的图像。

于 2018-08-31T22:23:09.993 回答
2

最终为我的团队工作的解决方案是/entrypoint.sh为 Docker 容器创建一个脚本,该脚本ENTRYPOINTDockerfile. 该脚本检查图像是否第一次在容器中运行——如果是,它将把大约 90gb 的数据库文件拉到本地容器中。如果它之前已经运行过并且有文件,它会跳过该过程。

这是完美的,因为它使我们的 AWS ECR 存储库保持精简,但如果开发人员需要生产数据的最新副本,我们可以部署一个映像,该映像将以最少的输入设置自己的必要数据。

于 2018-09-05T16:11:27.123 回答