构建docker映像的上下文非常大

构建docker映像的上下文非常大,docker,Docker,我已经在我的主机上创建了两个不同的目录,因为我试图学习Docker,只是为了让我的DockerFile井然有序。我刚才运行的Dockerfile如下所示: FROM crystal/centos MAINTAINER crystal ADD ./rpms/test.rpm ./rpms/ RUN yum -y --nogpgcheck localinstall /rpms/test.rpm 我的实际rpm只有1GB。但是当我尝试执行sudocker build-t=“crystal/te

我已经在我的主机上创建了两个不同的目录,因为我试图学习Docker,只是为了让我的DockerFile井然有序。我刚才运行的Dockerfile如下所示:

FROM crystal/centos
MAINTAINER crystal

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

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

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

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

或者,您可以将
rpms
文件夹移动到
Dockerfile
上方一个目录级别,并且仅将符号链接
test.rpm
移动到
Dockerfile
目录中



您通常会希望
.git
文件夹添加到
.dockerginore
中,这是一些用户在这里的评论中出现150MB->5GB差异的原因。

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

在我的情况下,当我使用错误的
-f
参数执行时,没有指向Dockerfile所在目录的路径

docker构建-无缓存-t nginx5-f/home/DF/Dockerfile/home/DF/
-右


docker构建--没有缓存-t nginx5-f/home/DF/Dockerfile
-错误

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

project 
|
-------docker-dir 
从docker dir开始构建,以下内容很好

docker build -t br_base:0.1 . 
从dock目录生成,生成上下文已更改。因此,我需要更改命令中的上下文。上下文由上面命令中的“.”给出

项目目录中的新命令应为

docker build -t br_base:0.1 ./base

此处的上下文由“/base”给出

如果您有一个
.dockerginore
文件,并且生成上下文仍然很大,您可以使用以下命令检查发送给docker生成上下文的内容:

请注意,某些
**
模式可能无法正常工作

有关更多评论,请参阅此Github问题:

更新2019 从Docker v18.06开始,可以选择使用名为的新图像生成器

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

传统Docker Build与新Docker BuildKit 下面是一个在构建目录中使用大量未使用文件构建映像的示例:

传统Docker构建:

$time docker映像生成--无缓存。
将生成上下文发送到Docker守护进程4.315GB
[...]
成功构建c9ec5d33e12e
实数0m51.035s
用户0m7.189s
系统0m10.712s
新Docker BuildKit:

$time DOCKER\u BUILDKIT=1 DOCKER映像生成—无缓存。
[+]建筑物0.1s(5/5)完工
=>[内部]从Dockerfile 0.0s加载生成定义
=>=>正在传输dockerfile:37B 0.0s
=>[内部]加载。dockerignore 0.0s
=>=>传输上下文:2B 0.0s
[...]
=>=>写入图像sha256:ba5bca3a525ac97573b2e1d3cb936ad50cf8129eedfa9 0.0s
实0.166s
用户0m0.034s
系统0m0.026s
唯一的变化是
DOCKER\u BUILDKIT=1
环境变量,时间上的差异很大

.dockrignore
文件
请注意,
.dockrignore
文件仍然有效且有用。一些
Dockerfile
命令,如
COPY
仍将考虑
.dockrignore
规则。但是生成目录中的侧文件(在
Dockerfile
中未引用)不再作为“生成上下文”进行复制通过BuildKit。

如果您想完全控制构建上下文,您也可以在不使用任何上下文的情况下完全构建容器,然后
将相关数据复制到容器中

docker build - < Dockerfile
docker构建-
这种方法的一个缺点是,使用这种方法,您只能在dockerfile中添加引用远程URL的内容,而不能添加来自本地主机的文件


如果要创建图像并获取信息,请参见 将生成上下文发送到docker后台程序,复制需要花费日志时间

然后添加.dockrignore文件。它应该包括
不需要复制。

对于
NodeJS应用程序
,添加一个
.dockerginore
文件以保存根项目目录,并在
.dockerginore
文件中添加以下内容

node_modules
dist

总结一下,如果Docker映像构建上下文太大,您可以做什么:

  • 确保上下文中没有未使用的文件(未使用的文件-在图像构建过程中仍然无法接触的文件)
  • 将未使用的文件和/或目录添加到.dockrignore(如上所述)
  • 确保将正确的文件夹指定为图像生成上下文(如上所述)
  • 尝试使用DOCKER_BuildKit=1的BuildKit(如上所述)
  • 尝试将项目分成更小的部分,以优化构建上下文的内容
  • 如果您有一个复杂的项目,您可能希望在构建之前在单独的文件夹中手动收集所有必要的文件,并将其用作spe的构建上下文
    node_modules
    dist