如何将项目添加到.dockerignore?

我无法find一个.dockerignore文件应该是什么样子的很多例子。

使用puppet在Docker容器上安装一些包会导致图像从600MB扩展到3GB。 我试图使用.dockerignore文件来保持.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 ,打破了构buildcaching

我已经尝试了以下.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

.dockerignore是为了防止将文件添加到在执行.dockerignore build时发送到docker守护进程的初始构build上下文,它不会创build全局规则来排除由Dockerfile生成的所有映像中的文件。

需要注意的是,每个RUN语句都会生成一个新的映像,该映像的父映像就是由它上面的Dockerfile语句生成的映像。 尝试将您的RUN语句合并为一个,以减less图像大小:

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

.dockerignore的格式应该等于.gitignore的格式。 查看示例文件和docker 文档 。

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

所以你应该尝试以下.dockerignore

 modules/* 

/开头可能是错误的,因为它只对文件的根目录有效(但对子目录不适用,所以也许没有/的recursion版本会改善)。

一个不同的方式来创build一个更小的图像,就是在主机上运行图书pipe理员 – 傀儡 ,而不是在Docker中,所以你不要以图像pipe理员,ruby,gem等为结尾。

我结束了一个使用Puppet的jenkins slave的622MB图像和一个没有Puppet的480MB 图像 。

http://docs.docker.com/articles/dockerfile_best-practices/

在我看来,你的做法是倒退(同意@csanchez),你应该从puppet生成你的docker容器,而不是在容器中运行puppet …

此外,你应该&&安装/应用/清理线…每个docker命令创build一个增量图像…如果有临时/资源文件是一部分的centos yum命令,你也应该这样做。

 FROM centos:centos6 # Add your needed files first # maybe you could use a baseimage and make this a volume mount point? Add Puppetfile / # combine multiple commands with cleanup of cache/temporary # space in the same run sequence to reduce wasted diff image space. #Work around selinux problem on cent images RUN yum install -y --enablerepo=centosplus libselinux-devel && \ yum install -y wget git tar openssh-server; yum -y clean all && \ librarian-puppet install && \ puppet apply --modulepath=/modules -e "class { 'buildslave': jenkins_slave => true,}" && \ librarian-puppet clean 

真的会build议在一个容器中避免使用SELINUX,它不会在容器内给你任何东西 。 更不用说,根据你想要创build的东西,从centos6开始的地方比较小。 我相信Ubuntu是更小的,debian:更小,还是更小,甚至阿尔卑斯山小起点。

值得注意的是,如果您使用支持虚拟坐标的文件系统,则您的文件大小可以为多个实例重复使用相同的基本映像,因此它不会长得更长

无论是:

 modules/* 

也不

 modules 

不会为我工作,docker工人不断地用不必要的文件污染图像,直到我这样设置:

 **/modules 

也适用于:

 **/modules/*.py 

优化容器映像大小是.dockerignore背后的主要目标,因为它的用途类似于.gitignore,因为它可以在提供服务的同时减less延迟和响应时间。 像Puppet,SaltStack或Ansible这样的部署自动化是正确的。 为服务执行部署定义的时间戳可能由于较大的图像大小和较低的networking带宽而失败。 所以.dockerignore有助于使图像的大小尽可能小。

你可以把它放到我们在docker build命令末尾指定的构build上下文目录中。 该文件遵循文件和目录的glob模式,以排除最终构build映像中的文件和目录。

假设我有一个目录。 img /到我的构build上下文,我想在构build映像时排除它,我只需将以下行添加到.dockerignore文件,

 .img 

而且,如果我想排除所有的文件开始。 那么简单地说,添加行,

 .* 

(注意:不要混淆Unix glob模式与正则expression式不同)

另外,我将从构build上下文中排除更多的文件,

 .* docs my-stack.dab docker-compose.overrride.yml test* *.md !README.md 

在这里, * .md行不包括所有降价文件(我的项目中有很多降价文件)。 但是,我想包括README.md和其他减价文件。 作为上面的最后一行,我们添加了README.md 或排除所有其他减价文件。

因此,借助这个function,我们可以在.dockerignore的帮助下减less构build映像的开销,并可以缩小映像的大小。