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

Lar*_*Cai 49 docker dockerfile

我们经常做的一件事是在Dockerfile构建Docker镜像时打包所有源代码.

ADD . /app
Run Code Online (Sandbox Code Playgroud)

我们怎样才能避免.git以简单的方式包含目录?

我试过用Unix来处理这个问题的方法 ADD [^.]* /app/

完整样本:

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/eaecf741f0e00a09782d5bcf16159cc8ea258b67/builder/internals.go#L115

Myk*_*rov 66

您可以借助.dockerignore文件排除不需要的文件


ALe*_*hha 26

我们怎样才能避免以简单的方式包含.git目录?

只需.dockerignore使用以下行创建在根上下文文件夹中调用的文件

**/.git
**/node_modules
Run Code Online (Sandbox Code Playgroud)

有了这样的行,Docker将排除目录.gitnode_modules任何子目录,包括root.Docker还支持一个**匹配任意数量目录(包括零)的特殊通配符字符串.

其次,它将失去目录结构,因为好\ a1变为a1

使用.dockerignore它不会

$ docker run -it --rm sample tree /opt/
/opt/
??? Dockerfile
??? c
?   ??? no_sslv2.patch
??? good
    ??? a1
        ??? README

3 directories, 3 files
Run Code Online (Sandbox Code Playgroud)

参考官方文档:.dockerignore