performance - 如何正确地 docker 化和连续集成20GB原始数据?

标签 performance docker continuous-integration

我有一个使用约20GB原始数据的应用程序。原始数据由二进制文件组成。

文件很少更改(如果有的话)。仅当文件中存在需要解决的错误时,更改才会发生。

解决此问题的最简单方法是将文件放在其自己的git存储库中,并基于此创建基础镜像。然后在原始数据镜像之上构建应用程序。
我没有尝试过为CI管道使用20GB的基本镜像,这似乎并不是解决这种情况的最佳方法。

我在这里采用此方法的主要原因是为了防止额外的部署复杂性。

是否有最佳做法,“正确”或更明智的方法来做到这一点?

最佳答案

像这样的巨大且大部分静态的数据块可能是“Docker镜像应自包含”规则的一大异常(exception)。我建议将这些数据保存在其他位置,然后从核心docker run工作流程中单独下载。

过去,我在处理数千兆字节的图像时遇到了麻烦。像docker pushdocker 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/

相关文章:

sql - 如何简化包含许多内部选择的选择查询并提高 PostgreSQL 的性能

java - 单个查询与多个查询

python - 带有Python Pyramid应用程序的Docker和WSGI?

git - 标准错误 : fatal: cannot exec '/tmp/ssh**.sh' : Permission denied fatal: unable to fork

java - 检查列表内对象值之间是否相等的优化方法

python - 根据 Pandas 数据框中的特定条件更快地计算滚动发生次数

docker - Docker运行<image>总是在standard_init_linux.go:207上出错:exec用户进程在Windows上导致 “no such file or directory”

bash - AWS上的Docker-环境变量未从主机继承到容器

github - 仅在阻止拉取请求时手动运行 GitHub 操作

ssl - TeamCity 和 Mercurial https