我找不到很多.dockerignore文件应该是什么样子的例子。
使用木偶在码头容器上安装几个软件包会导致映像从600 to爆炸到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
发布于 2014-09-09 15:26:42
.dockerignore是为了防止在执行docker build时将文件添加到发送到码头守护进程的初始构建上下文中,它不会创建一个全局规则来排除在Dockerfile生成的所有图像中创建文件。
需要注意的是,每个RUN语句都将生成一个新的映像,该映像的父值是由它上面的Dockerfile语句生成的图像。尝试将RUN语句折叠到一个单独的语句中,以减小图像大小:
RUN librarian-puppet install &&\
puppet apply --modulepath=/modules -e "class { 'buildslave': jenkins_slave => true,}" &&\
librarian-puppet clean发布于 2019-05-11 00:08:00
.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“是在build命令末尾传递的目录,通常是一个.,用于指示当前目录。这个目录是从码头客户端打包的,不包括您在.dockerignore中忽略的任何文件,并发送到停靠守护进程以执行构建。即使守护进程与客户端位于同一台主机上,构建也只能在此上下文中工作,而不是直接从文件夹中运行。
构建只有一个.dockerignore,它必须位于构建上下文的根中。如果它位于您的主目录中(假设您是从子目录构建的话),那么它将无法工作,并且不会在构建上下文的子目录中工作。
要测试当前构建上下文中的内容,并验证.dockerignore文件是否正确运行,您可以复制/粘贴以下内容(假设您没有名为test-context的图像,则会覆盖它,然后删除):
# create an image that includes the entire build context
docker build -t test-context -f - . <<EOF
FROM busybox
COPY . /context
WORKDIR /context
CMD find .
EOF
# run the image which executes the find command
docker container run --rm test-context
# cleanup the built image
docker image rm test-contexthttps://stackoverflow.com/questions/25490911
复制相似问题