我无法找到许多.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
.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
格式.dockerignore
应该等于.gitignore
.请参阅示例文件和docker 文档.
该文件应该是.dockerignore
由换行符分隔的排除模式列表(相对于文件的路径).
所以你应该尝试以下方法.dockerignore
:
modules/*
在/
一开始可能是错误的,因为它只会是有效的文件的根目录下(但不包括子目录,所以也许递归版本没有/
将做得更好,而不是).
无论是:
modules/*
也不
modules
对我不起作用,docker一直用不必要的文件污染图像,直到我这样设置:
**/modules
也适用于:
**/modules/*.py
该.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 - . <