我在我的主机上创建了几个不同的目录,因为我试图学习Docker,只是为了让我的dockerfile有条理。我刚刚运行的Dockerfile是这样的:

FROM crystal/centos
MAINTAINER crystal

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

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


当前回答

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

make sure you don't have unused files in the context (unused files - those that still untouchable during image building); add unused files and/or directories to .dockerignore (as mentioned here); make sure you specify the right folder as an image build context (as mentioned here); try to use BuildKit with DOCKER_BUILDKIT=1 (as mentioned here); try to split your project into smaller parts to optimize content of build context; if you have a complex project you may want to manually collect all necessary files in separate folder before build and use it as a build context for a specific image.

其他回答

检查构建的docker映像的最佳工具是dive https://github.com/wagoodman/dive

以下是官方说明书中的说明:

要分析Docker映像,只需运行带有image标签/id/digest的dive:

dive <your-image-tag>

或者如果你想建立你的图像,那么直接开始分析它:

dive build -t <some-tag> .

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

docker build - < Dockerfile

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

看到https://docs.docker.com/engine/reference/commandline/build/建立与—

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

node_modules
dist

如果你在创造图像和获取信息 将构建上下文发送到docker守护进程,该守护进程需要日志时间来复制,

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

更新2019

从Docker v18.06开始,有一个选项可以使用一个名为Build Kit的新映像构建器。

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

传统Docker Build vs新Docker BuildKit

下面是一个用build目录中一个巨大的未使用的文件构建映像的例子:

遗留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规则。但是build目录中的副文件(没有在Dockerfile中引用)不再被BuildKit复制为“构建上下文”。