为Docker映像构建上下文非常大


141

我尝试在主机上创建几个不同的目录,以尝试了解Docker,以使dockerfile井井有条。我刚运行的Dockerfile如下所示:

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" .,我将构建上下文发送到3.5 GB的Docker守护进程。当您继续构建Docker映像时,还有其他我不知道的事情吗?当我在主机上的其他目录中构建更多映像时,是否正在累积内存?


2
构建上下文是当前目录中的所有文件/目录。
纳宾

仅将构建所需的文件保留在此目录中。即,将Dockerfile和任何本地文件/目录复制/添加到Dockerfile中的构建映像。另外,请使用.dockerignore
Vishrant

Answers:


265

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

您可以设置.dockerignore文件以使Docker忽略某些文件。您可能要尝试一下。

另外,您也可以将rpms文件夹移动到上一个目录级别Dockerfile,而仅将符号链接移动test.rpmDockerfile的目录中。


正如许多用户在评论中指出的那样,一个文件夹需要添加.git.dockerignore其中,这是我的情况造成150MB-> 5GB差异的原因。


4
不幸的是,在这种情况下似乎无法进行符号链接,因为该ADD命令在构建期间不会跟随符号链接。请参阅:github.com/docker/docker/issues/1676
JimmidyJoo

5
救命!一定要加:Rails开发tmp log.dockerignore+其他自定义的
equivalent8

7
不要忘记将.git文件夹添加到.dockerignore文件(假设您使用的是git)
dsncode

8
是的,.git文件夹默认包含-这无疑抓住了我。
Paul Suart '18

1
什么是“构建上下文”?我尝试使用docker build RUN命令查找这些文件,但是在构建期间,我看不到docker文件系统内Dockerfile文件夹中的文件。有人可以给我一个简单的示例,说明构建上下文如何有用吗?
帕特里克

52

更新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规则。但是DockerfileBuildKit不再将构建目录中的辅助文件(未在中引用)复制为“构建上下文”。


1
请务必注意,Windows容器当前不支持DOCKER_BUILDKIT。(仅限Linux,列在以下限制条件下:docs.docker.com/develop/develop-images/build_enhancements
Vaccano,

17

我通过将Dockerfile和docker-compose.yml移到子文件夹中进行了修复,效果很好。显然,docker将当前文件夹发送到守护程序,而我的文件夹是9个演出。


4
此方法提供了禁止的路径:如果正在复制父目录中的文件,则在构建上下文错误之外,对此有什么解决方案?
Kitwradr


4

以我-f为例,当我执行错误的参数时-没有指向Dockerfile所在目录的路径

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

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



0

我有和FreeStyler相同的问题。但是,我是根据目录从上下文构建的。因此,-f参数正确,上下文不正确。

project 
|
-------docker-dir 

从docker-dir构建以下内容很好

docker build -t br_base:0.1 . 

从dock-dir构建,构建上下文已更改。因此,我需要在命令中更改上下文。上下文由“。”给出。在上面的命令中。

项目目录中的新命令应为

docker build -t br_base:0.1 ./base

这里的上下文由“ ./base”给出


0

如果您正在创建图像并获取将构建上下文发送到docker daemon的消息 ,这需要花费日志时间进行复制,

然后添加.dockerignore文件。它应该包括不需要复制的文件或目录。


0

对于NodeJS Application,请在.dockerignore您的根项目目录中添加一个文件,并在.dockerignore文件内部添加以下内容

node_modules
dist
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.