为非常大的 docker 图像构建上下文

新手上路,请多包涵

我在我的主机上创建了几个不同的目录,因为我试图了解 Docker 只是为了让我的 dockerfiles 井井有条。我刚刚运行的 Dockerfile 如下所示:

 FROM crystal/centos
MAINTAINER crystal

ADD ./rpms/test.rpm ./rpms/
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm

我的实际 rpm 只有 1 GB。但是当我尝试做 sudo docker build -t="crystal/test" . 时,我将构建上下文发送到 3.5 GB 的 Docker 守护进程。当您继续构建 Docker 映像时,还有什么我不知道的吗?当我在主机上的其他目录中构建更多图像时,我的内存是否在积累?

原文由 Crystal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 344
2 个回答

Docker 客户端将整个“构建上下文”发送到 Docker 守护程序。该构建上下文(默认情况下)是 Dockerfile 所在的整个目录(因此,整个 rpms 树)。

你可以设置一个 .dockerignore 文件来让 Docker 忽略一些文件。您可能想尝试一下。

Alternatively, you can move your rpms folder one directory level above your Dockerfile , and only symlink test.rpm into the Dockerfile ’s directory.


您通常希望 .git 文件夹添加到 .dockerignore 中,这是此处评论中某些用户存在 150MB -> 5GB 差异的原因。

原文由 Thomas Orozco 发布,翻译遵循 CC BY-SA 4.0 许可协议

2019 年更新

从 Docker v18.06 开始,可以选择使用名为 Build Kit 的新镜像构建器。

它与 Docker 预先捆绑在一起,无需安装任何东西。它向后兼容 Dockerfile 语法,无需更改 Dockerfile

旧版 Docker Build 与新 Docker BuildKit

这是一个在构建目录中使用巨大的未使用文件构建映像的示例:

旧版 Docker 构建:

 $ time docker image build --no-cache .
Sending build context to Docker daemon  4.315GB
[...]
Successfully built c9ec5d33e12e

real    0m51.035s
user    0m7.189s
sys 0m10.712s

新的 Docker BuildKit:

 $ time DOCKER_BUILDKIT=1 docker image build --no-cache .
[+] Building 0.1s (5/5) FINISHED
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 37B                                        0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
[...]
 => => writing image sha256:ba5bca3a525ac97573b2e1d3cb936ad50cf8129eedfa9  0.0s

real    0m0.166s
user    0m0.034s
sys 0m0.026s

唯一的变化是 DOCKER_BUILDKIT=1 环境变量,时间差异很大。

.dockerignore 文件

请注意, .dockerignore 文件仍然有效且有用。一些 Dockerfile 诸如 COPY . . --- 之类的命令仍会考虑 .dockerignore 规则。但是构建目录中的边文件(不在 Dockerfile 中引用)不再被 BuildKit 复制为“构建上下文”。

原文由 Andriy Berestovskyy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题