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

build context for docker image very large

我在主机上创建了几个不同的目录,试图了解Docker,只是为了保持Dockerfiles的组织性。我刚运行的Dockerfile如下:

1
2
3
4
5
FROM crystal/centos
MAINTAINER crystal

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

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


docker客户机将整个"构建上下文"发送到docker守护进程。构建上下文(默认情况下)是Dockerfile所在的整个目录(因此,整个rpms树)。

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

或者,您可以将您的rpms文件夹移到您的Dockerfile之上的一个目录级别,并且只将symlink test.rpm移到Dockerfile的目录中。


我把dockerfile和docker-compose.yml移到一个子文件夹中,修复了它,效果很好。显然,Docker将当前文件夹发送到守护进程,我的文件夹是9 Gigs。


更新2019

从Docker v18.06开始,有一个选项可以使用名为build kit的新图像生成器。

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

传统Docker Build与新Docker BuildKit

下面是在build目录中使用大量未使用的文件构建图像的示例:

传统Docker构建:

1
2
3
4
5
6
7
8
$ 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:

1
2
3
4
5
6
7
8
9
10
11
12
$ 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规则。但是buildKit不再将build目录中的侧文件(在Dockerfile中没有引用)复制为"build上下文"。


在我的例子中,当我使用错误的-f参数执行时——没有指向dockerfile所在目录的路径

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile错误


如果您有一个.dockerignore文件,并且构建上下文仍然很大,则可以使用silver searcher检查发送到docker构建上下文的内容:

1
ag --path-to-ignore .dockerignore --files-with-matches

注意,一些**模式可能无法正常工作。

更多评论请参见本期Github:https://github.com/moby/moby/issues/16056


我和自由泳有同样的问题。然而,我是从我的上下文中创建一个目录。所以-f参数是正确的,上下文是错误的。

1
2
3
project
|
-------docker-dir

从docker dir开始建造,以下是很好的

1
docker build -t br_base:0.1 .

从dock目录生成时,生成上下文已更改。因此,我需要更改命令中的上下文。上下文由上述命令中的"."提供。

来自项目目录的新命令应该是

1
docker build -t br_base:0.1 ./base

这里的上下文由"./base"给出。