我们经常做的一件事是在构建Docker镜像时将所有源代码打包在Dockerfile
中。
ADD . /app
我们如何避免以简单的方式包含.git
目录?
我尝试使用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
答案 0 :(得分:59)
您可以借助.dockerignore file
排除不需要的文件答案 1 :(得分:19)
我们怎样才能避免以简单的方式包含.git目录?
只需在根上下文文件夹中创建一个名为.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
参考官方文档:.dockerignore
答案 2 :(得分:0)
在根目录中添加 .dockerignore 文件(语法类似于 .gitignore 文件)