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

时间:2014-10-28 04:10:50

标签: docker

我在主机上创建了几个不同的目录,因为我试图了解Docker只是为了保持我的dockerfiles有条理。我刚刚运行的我的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" .时,我会将构建上下文发送到Docker守护程序3.5 GB。当你继续构建Docker镜像时,还有其他我不知道的东西吗?当我在主机上的其他目录中构建更多图像时,我的内存是否在累积?

11 个答案:

答案 0 :(得分:158)

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

您可以设置.dockerignore文件以使Docker忽略某些文件。你可能想试试它。

或者,您可以将rpms文件夹的一个目录级别移到Dockerfile之上,只将符号链接test.rpm移动到Dockerfile的目录中。

答案 1 :(得分:14)

我通过将我的Dockerfile和docker-compose.yml移动到子文件夹来修复它,它运行得很好。显然,docker将当前文件夹发送到守护进程,我的文件夹是9演出。

答案 2 :(得分:5)

更新2019

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

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

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

答案 3 :(得分:3)

在我的情况下,当我执行错误的-f参数时 - 没有找到Dockerfile的目录的路径

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

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

答案 4 :(得分:3)

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

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

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

有关其他评论,请参见此Github问题:https://github.com/moby/moby/issues/16056

答案 5 :(得分:1)

检查构建的 docker 镜像的好工具是 dive https://github.com/wagoodman/dive

以下是官方自述文件中的说明:

要分析 Docker 镜像,只需使用镜像标签/id/digest 运行潜水:

dive <your-image-tag>

或者如果你想构建你的图像,然后直接进入分析它:

dive build -t <some-tag> .

答案 6 :(得分:0)

我和FreeStyler有同样的问题。但是我是从我的上下文中的目录构建的。所以-f参数是正确的,上下文不正确。

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

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

docker build -t br_base:0.1 . 

从dock-dir构建,构建上下文发生了变化。因此我需要更改命令中的上下文。上下文由&#39;。&#39;给出。在上面的命令中。

项目目录中的新命令应为

docker build -t br_base:0.1 ./base

这里的背景由&#39; ./ base&#39;

提供

答案 7 :(得分:0)

如果您希望完全控制自己的构建上下文,则也可以完全构建容器,而无需任何上下文,并且随后将COPY相关数据放入容器中。

docker build - < Dockerfile

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

请参见https://docs.docker.com/engine/reference/commandline/build/#build-with--

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

node_modules
dist

答案 10 :(得分:-1)

仅总结一下如果您的Docker映像构建上下文太大,该怎么办:

  • 确保上下文中没有未使用的文件(未使用的文件-在图像构建期间仍然无法触摸的文件);
  • 将未使用的文件和/或目录添加到.dockerignore(如here所述);
  • 确保将正确的文件夹指定为映像构建上下文(如here所述);
  • 尝试将BuildKit与DOCKER_BUILDKIT = 1(如here所述)一起使用;
  • 尝试将您的项目分成较小的部分以优化构建上下文的内容;
  • 如果您有一个复杂的项目,则可能需要在构建之前手动将所有必需的文件收集在单独的文件夹中,并将其用作特定图像的构建上下文。