docker-.dockerignore 文件
2021-07-18 本文已影响0人
yjtuuige
概述
-
.dockerignore文件的作用类似于git工程中的.gitignore。不同的是.dockerignore应用于docker镜像的构建,它存在于docker构建上下文的根目录,用来排除不需要上传到docker服务端的文件或目录。 -
docker在构建镜像时首先从构建上下文找有没有.dockerignore文件,如果有的话则在上传上下文到docker服务端时忽略掉.dockerignore里面的文件列表。
好处是:
- 构建镜像时能避免不需要的大文件上传到服务端,从而拖慢构建的速度、网络带宽的消耗;
- 可以避免构建镜像时将一些敏感文件及其他不需要的文件打包到镜像中,从而提高镜像的安全性;
.dockerignore 文件编写方法
-
.dockerignore文件的写法和.gitignore类似,支持正则和通配符,具体规则如下:
1、每行为一个条目;
2、空行被忽略;
3、构建上下文路径为所有文件的根路径; -
文件匹配规则具体语法如下:
| 符号 | 作用 |
|---|---|
| # | 注释 |
| * | 匹配0或多个非/的字符 |
| ? | 匹配1个非/的字符 |
| ** | 0个或多个目录 |
| ! | 除...外,需结合上下文语义 |
示例:
- 示例 1:
# comment
*/*/temp*
temp?
**/*.md
- 示例 2:除
README.md外,所有其他md文件都被docker忽略
*.md
!README.md
⚠️注意事项:
- 如果两个匹配语法规则有包含或者重叠关系,那么以后面的匹配规则为准,比如:
# comment
*.md
!README*.md
README-secret.md
- 将根路径下所有以
.md结尾的文件排除,以README开头.md结尾的文件保留,但是README-secret.md文件排除。
*.md
README-secret.md
!README*.md
- 将根路径下所有以
.md结尾和名称为README-secret.md的文件排除,但所有以README开头.md结尾的文件保留。这样的话README-secret.md依旧会被保留,并不会被排除,因为README-secret.md符合!README*.md规则。
使用案例
-
Dockerfile放在git仓库根路径下,但git工程中有很多真正应用跑起来用不到的文件,如果直接在Dockerfile中使用COPY或ADD指令拷贝文件,那么很显然会把很多不需要的文件拷贝到镜像中,从而会拖慢构建镜像的过程,产生的镜像也比较臃肿。 - 解决方法就是编写
.dockerignore文件,忽略掉不需要的文件,然后放到docker构建上下文的根路径下。 -
.dockerignore:
.git
_mockData
deleted
email-templates
script
static
-
Dockerfile:
FROM node:8-alpine
COPY . /app/node
WORKDIR /app/node
RUN yarn install
EXPOSE 8026
CMD ["yarn", "run", "tool-dev"]
-
使用
.dockerignore前后上传到docker服务端的构建上下文大小对比: -
使用前(
73.36MB):
[vagrant@docker]$ docker build -t tool:5.0 -f Dockerfile-frontend-tool .
Sending build context to Docker daemon 73.36MB
Step 1/6 : FROM node:8-alpine
- 使用后(
11.38MB):
[vagrant@docker]$ docker build -t tool:6.0 -f Dockerfile-frontend-tool .
Sending build context to Docker daemon 11.38MB
Step 1/6 : FROM node:8-alpine