如何在Dockerfile中添加除.git之类的隐藏目录之外的所有文件/目录

我们经常做的一件事就是在构buildDocker镜像时将所有源代码打包到Dockerfile

 ADD . /app 

我们如何避免以简单的方式包含.git目录?

我尝试了使用ADD [^.]* /app/

完整的样本:

 docker @ boot2docker:/ mnt / sda1 / tmp / abc $ find。
 。
 。/C
 ./.git
 ./Dockerfile
 。/好
 ./good/a1
 docker @ boot2docker:/ mnt / sda1 / tmp / abc $ cat Dockerfile
从Ubuntu的

 ADD [^。] * / app /
 docker @ boot2docker:/ mnt / sda1 / tmp / abc $ docker build -t abc。
发送构build上下文到Docker守护进程4.096 kB
发送构build上下文到Docker守护进程
第0步:从Ubuntu的
  ---> 04c5d3b7b065
第1步:添加[^。] * / app /
 d ---> 5d67603f108b
删除中间容器60159dee6ac8
成功构build5d67603f108b
 docker @ boot2docker:/ mnt / sda1 / tmp / abc $ docker run -it abc
 root @ 1b1705dd66a2:/#ls -l app
总共4
 -rw-r  -  r-- 1 1000人员30 Jan 22 01:18 Dockerfile
 -rw-r  -  r-- 1 root root 0 1月22日01:03 a1
 -rw-r  -  r-- 1 root root 0 Jan 22 00:10 c

其次,它将会丢失目录结构,因为good\a1会变成a1

Docker中的相关源代码是https://github.com/docker/docker/blob/eaecf741f0e00a09782d5bcf16159cc8ea258b67/builder/internals.go#L115

您可以在.dockerignore文件的帮助下排除不需要的文件

我们如何避免以简单的方式包含.git目录?

只需在根上下文文件夹中使用以下几行创build一个名为.dockerignore的文件即可

 **/.git **/node_modules 

通过这样的代码,docker将从包括root的任何子目录中排除目录.git和node_modules。 Docker也支持一个特殊的通配符**,匹配任意数量的目录(包括零)。

其次,它会失去目录结构,因为好的\ a1被更改为a1

与.dockerignore它不会

 $ docker run -it --rm sample tree /opt/ /opt/ ├── Dockerfile ├── c │  └── no_sslv2.patch └── good └── a1 └── README 3 directories, 3 files