我有一个使用约20GB原始数据的应用程序。原始数据由二进制文件组成。
文件很少更改(如果有的话)。仅当文件中存在需要解决的错误时,更改才会发生。
解决此问题的最简单方法是将文件放在其自己的git存储库中,并基于此创建基础镜像。然后在原始数据镜像之上构建应用程序。
我没有尝试过为CI管道使用20GB的基本镜像,这似乎并不是解决这种情况的最佳方法。
我在这里采用此方法的主要原因是为了防止额外的部署复杂性。
是否有最佳做法,“正确”或更明智的方法来做到这一点?
最佳答案
像这样的巨大且大部分静态的数据块可能是“Docker镜像应自包含”规则的一大异常(exception)。我建议将这些数据保存在其他位置,然后从核心docker run
工作流程中单独下载。
过去,我在处理数千兆字节的图像时遇到了麻烦。像docker push
和docker pull
这样的操作尤其容易卡在单个层的第二个千兆字节上。如您所说,如果静态内容很少更改,那么还存在一个问题,即将其放置在线性层顺序中。写这样的东西很诱人
FROM ubuntu:18.04
ADD really-big-content.tar.gz /data
...
但是,即使
ubuntu:18.04
镜像也会定期更改(它会相当频繁地更新安全性;您的CI管道也应明确对其进行docker pull
编码),并且在执行新构建时,必须再次传输整个未更改的20 GB块。相反,我会将它们放在类似AWS S3存储桶或类似对象存储的地方。 (这对于源代码管理系统来说是一个差劲的匹配,源代码管理系统(a)希望永久保留旧内容,而(b)倾向于针对文本而不是二进制文件进行优化。)然后,我将有一个脚本在可下载该内容的主机上运行,然后将相应的主机目录装入需要它的容器中。
curl -LO http://downloads.example.com/really-big-content.tar.gz
tar xzf really-big-content.tar.gz
docker run -v $PWD/really-big-content:/data ...
(在Kubernetes或另一个分布式世界中,我可能需要编写一个专用的Job来将内容下载到Persistent Volume中,并作为群集启动的一部分运行它。您可以在普通Docker中执行相同的操作来下载内容放入命名卷中。)
关于performance - 如何正确地 docker 化和连续集成20GB原始数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57357797/