关于docker:如何在Dockerfile中添加除.git等隐藏目录之外的所有文件/目录

How to ADD all files/directories except a hidden directory like .git in Dockerfile

我们经常做的事情之一是在构建Docker映像时将所有源代码打包到Dockerfile中。

1
ADD . /app

如何避免简单地包含.git目录?

我试过用Unix的方法来处理这个问题。

完整样品:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
docker@boot2docker:/mnt/sda1/tmp/abc$ find .
.
./c
./.git
./Dockerfile
./good
./good/a1
docker@boot2docker:/mnt/sda1/tmp/abc$ cat Dockerfile
FROM ubuntu

ADD [^.]* /app/
docker@boot2docker:/mnt/sda1/tmp/abc$ docker build -t abc .
Sending build context to Docker daemon 4.096 kB
Sending build context to Docker daemon
Step 0 : FROM ubuntu
 ---> 04c5d3b7b065
Step 1 : ADD [^.]* /app/
d ---> 5d67603f108b
Removing intermediate container 60159dee6ac8
Successfully built 5d67603f108b
docker@boot2docker:/mnt/sda1/tmp/abc$ docker run -it abc
root@1b1705dd66a2:/# ls -l app
total 4
-rw-r--r-- 1 1000 staff 30 Jan 22 01:18 Dockerfile
-rw-r--r-- 1 root root   0 Jan 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/eaecf741f0a09782d5bcf16159cc8ea258b67/builder/internals.go l115


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


How can we avoid including the .git directory in simple way ?

只需在根上下文文件夹中创建一个名为.dockerignore的文件,并使用以下行

1
2
**/.git
**/node_modules

使用这些行,Docker将从任何子目录(包括根目录)中排除目录.gitnode_modules。Docker还支持一个特殊的通配符字符串**,它与任意数量的目录(包括零)匹配。

And secondly, it will lose the directory structure, since good\a1 gets changed to a1

有了码头码头,就不会了。

1
2
3
4
5
6
7
8
9
10
$ docker run -it --rm sample tree /opt/
/opt/
├── Dockerfile
├── c
│   └── no_sslv2.patch
└── good
    └── a1
        └── README

3 directories, 3 files

官方文件参考:.dockerignore


在根目录中添加.dockerignore文件(语法类似于.gitignore文件)