当前位置:  开发笔记 > 前端 > 正文

如何将项目添加到.dockerignore?

如何解决《如何将项目添加到.dockerignore?》经验,为你挑选了4个好方法。

我无法找到许多.dockerignore文件应该是什么样子的例子.

使用puppet在docker容器上安装一些软件包会导致映像从600MB扩展到3GB.我正在尝试使用.dockerignore文件将大小保持为最小值

$ cat Dockerfile  
FROM centos:centos6

#Work around selinux problem on cent images
RUN yum install -y --enablerepo=centosplus libselinux-devel

RUN yum install -y wget git tar openssh-server; yum -y clean all

Add Puppetfile / 
RUN librarian-puppet install
RUN puppet apply --modulepath=/modules -e "class { 'buildslave': jenkins_slave => true,}"
RUN librarian-puppet clean

如果我跑,docker images --tree我可以看到图像瞬间增长几GB

$ docker images --tree
                ??e289570b5555 Virtual Size: 387.7 MB
                ? ??a7646acf90d0 Virtual Size: 442.5 MB
                ?   ??d7bc6e1fbe43 Virtual Size: 442.5 MB
                ?     ??772e6b204e3b Virtual Size: 627.5 MB
                ?       ??599a7b5226f4 Virtual Size: 627.5 MB
                ?         ??9fbffccda8bd Virtual Size: 2.943 GB
                ?           ??ee46af013f6b Virtual Size: 2.943 GB
                ?             ??3e4fe065fd07 Virtual Size: 2.943 GB
                ?               ??de9ec3eba39e Virtual Size: 2.943 GB
                ?                 ??31cba2716a12 Virtual Size: 2.943 GB
                ?                   ??52cbc742d3c4 Virtual Size: 2.943 GB
                ?                     ??9a857380258c Virtual Size: 2.943 GB
                ?                       ??c6d87a343807 Virtual Size: 2.964 GB
                ?                         ??f664124e0080 Virtual Size: 2.964 GB
                ?                           ??e6cc212038b9 Virtual Size: 2.964 GB Tags: foo/jenkins-centos6-buildslave:latest

我相信图像变得如此之大的原因是因为librarian-puppet克隆了一个/modules破坏构建缓存的木偶模块

我试过以下.dockerignore文件没有运气.

$ cat .dockerignore
/modules
/modules/
/modules/*

这是.dockerignore文件的正确语法吗?
有没有其他方法可以防止这些容器变得如此之大?

附加信息:

http://kartar.net/2013/12/building-puppet-apps-inside-docker/
http://danielmartins.ninja/posts/a-week-of-docker.html



1> Abe Voelker..:

.dockerignore是为了防止文件被添加到发送到docker守护程序的初始构建上下文中docker build,它不会创建一个全局规则来排除在Dockerfile生成的所有图像中创建文件.

重要的是要注意每个RUN语句将生成一个新图像,该图像的父图像是由它上面的Dockerfile语句生成的图像.尝试将您的RUN语句折叠为单个语句以减小图像大小:

RUN librarian-puppet install &&\
 puppet apply --modulepath=/modules -e "class { 'buildslave': jenkins_slave => true,}" &&\
 librarian-puppet clean



2> ConcurrentHa..:

格式.dockerignore应该等于.gitignore.请参阅示例文件和docker 文档.

该文件应该是.dockerignore由换行符分隔的排除模式列表(相对于文件的路径).

所以你应该尝试以下方法.dockerignore:

modules/*

/一开始可能是错误的,因为它只会是有效的文件的根目录下(但不包括子目录,所以也许递归版本没有/将做得更好,而不是).


`.dockerignore`并不完全等同于`.gitignore`.例如,`.gitignore`具有用于评估未遵循`.dockerignore`的目录的规则; 例如`.gitignore`中的`/ log`将忽略`.gitignore`所在的同一目录中的`log`目录,但`.dockerignore`不会以相同的方式处理前导`/`从构建上下文中排除它.因此,您不一定能够将规则直接从`.gitignore`复制到未修改的`.dockerignore`中.
更新 - .dockerignore已添加到docker 1.1.0中.在撰写本文时,我的ubuntu repo有docker 1.0.1,但最新版本的docker是1.4.0.不确定.dockerignore文件的早期实现,但在docker 1.3.3中,它不支持目录名称的尾部斜杠,这意味着您无法区分文件名和目录名.如果将`foo`添加到.dockerignore文件中,则会忽略名为foo的文件和名为foo的目录.从1.4.0开始,支持目录名称的尾部斜杠,与.gitignore语法相匹配.
有点让我觉得新行必须是Unix新行,而不是Windows新行.我在Windows上编辑了一个.dockerignore文件发送到Unix系统,并且docker一直"忽略"我的忽略,直到我将其转换为Unix风格的换行符!

3> Kostyantyn..:

无论是:

modules/*

也不

modules

对我不起作用,docker一直用不必要的文件污染图像,直到我这样设置:

**/modules

也适用于:

**/modules/*.py



4> BMitch..:

.dockerignore文件类似于.gitignore语法。以下是一些示例规则:

# Ignore a file or directory in the context root named "modules"
modules

# Ignore any files or directories within the subdirectory named "modules" 
# in the context root
modules/*

# Ignore any files or directories in the context root beginning with "modules"
modules*

# Ignore any files or directories one level down from the context root named
# "modules"
*/modules

# Ignore any files or directories at any level, including the context root, 
# named modules
**/modules

# Ignore every file in the entire build context (see next rule for how this 
# could be used)
*

# Re-include the file or directory named "src" that may have been previously
# excluded. Note that you cannot re-include files in subdirectories that have 
# been previously excluded at a higher level
!src

请注意,“ build context”是您在build命令末尾传递的目录,通常是a .,指示当前目录。该目录从Docker客户端打包,不包括您使用忽略的任何文件.dockerignore,并发送到docker守护程序执行构建。即使守护程序与客户端位于同一主机上,构建也只能在此上下文中工作,而不能直接在文件夹中工作。

.dockerignore一个构建只有一个,它必须在构建上下文的根目录中。如果它位于您的主目录中(假设您是从子目录构建的),它将不起作用,并且它也不会从构建上下文的子目录起作用。

要测试当前构建上下文中的内容并验证.dockerignore文件的行为是否正确,您可以复制/粘贴以下内容(假定您没有名为的图像test-context,如果存在,它将被覆盖,然后删除):

# create an image that includes the entire build context
docker build -t test-context -f - . <

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有