侧边栏壁纸
博主头像
汪洋

即使慢,驰而不息,纵会落后,纵会失败,但一定可以达到他所向的目标。 - 鲁迅

  • 累计撰写 212 篇文章
  • 累计创建 81 个标签
  • 累计收到 160 条评论

Docker - Dockerfile Ignore

汪洋
2022-03-31 / 0 评论 / 0 点赞 / 492 阅读 / 2,636 字

.dockerignore 文件说明

.dockerignore 文件的作用类似于 git 工程中的 .gitignore 。不同的是 .dockerignore 应用于 docker 镜像的构建,它存在于 docker 构建上下文的根目录,用来排除不需要上传到 docker 服务端的文件或目录。

docker 在构建镜像时首先从构建上下文找有没有 .dockerignore 文件,如果有的话则在上传上下文到 docker 服务端时忽略掉 .dockerignore 里面的文件列表。这么做显然带来的好处是:

  • 构建镜像时能避免不需要的大文件上传到服务端,从而拖慢构建的速度、网络带宽的消耗;
  • 可以避免构建镜像时将一些敏感文件及其他不需要的文件打包到镜像中,从而提高镜像的安全性;

.dockerignore 文件编写方法

.dockerignore 文件的写法和 .gitignore 类似,支持正则和通配符,具体规则如下:

  • 每行为一个条目;
  • # 开头的行为注释;
  • 空行被忽略;
  • 构建上下文路径为所有文件的根路径;
文件匹配规则具体语法如下
规则行为
*/temp*匹配根路径下一级目录下所有以 temp 开头的文件或目录
*/*/temp*匹配根路径下两级目录下所有以 temp 开头的文件或目录
temp?匹配根路径下以 temp 开头,任意一个字符结尾的文件或目录
**/*.go匹配所有路径下以 .go 结尾的文件或目录,即递归搜索所有路径
*.md匹配根路径下所有以 .md 结尾的文件或目录,但 README.md 除外
!README.md
注意事项

如果两个匹配语法规则有包含或者重叠关系,那么以后面的匹配规则为准,比如:

*.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 规则。

最终演示

我们先看当前的目录下的文件列表。我将会在其中:

  • 排除 .git 文件或者目录
  • 排除 .log 文件,或者以 -log-*= 的文件
  • *排除 .tag.gz 文件
  • .war 文件,以及 jenkins_home 下的 .txt 文件
  • Dockerfile 文件
  • *.dockerignore 文件,包括所有的 .md 文件,但是 info.md 除外

那么最终就剩下 jenkins_home 下的 mark 目录和 info.md 了

[root@wangyanglinux /root/2021/ignore]# tree -a .
.
├── 0.log
├── 1.log
├── 2.log
├── Dockerfile
├── .dockerignore
├── .git
├── info.md
├── jenkins-2.2365.tar.gz
├── jenkins_home
│   ├── 2021-01-11_10:15:47.txt
│   └── mark
├── jenkins.war
├── link.md
└── readme.md

2 directories, 12 files
  • .dockerignore文件
[root@wangyanglinux /root/2021/ignore]# cat .dockerignore 
# 排除 .git 文件或者目录
.git
# 排除 .log 文件,或者包含  -log- 的文件
**/*.log
**/*-log-*
# 排除 *.tag.gz 文件
**/*.tar.gz
# .war 文件,以及 jenkins_home 下的* .txt 文件
**/*.war
jenkins_home/*.txt
# Dockerfile 文件
Dockerfile
# .dockerignore 文件,包括所有的 *.md 文件,但是 info.md 除外
.dockerignore
*.md
!info.md
  • Dockerfile
FROM alpine:3.1
MAINTAINER wangyanglinux 宝典
WORKDIR /opt/
COPY . /opt/
CMD ["sleep","66666666"]
  • Build
[root@wangyanglinux /opt/2021/ignore]# docker build -t ignore .
Sending build context to Docker daemon  10.608kB
Step 1/5 : FROM alpine:3.1
 ---> caa27325b098
Step 2/5 : MAINTAINER wangyanglinux 宝典
 ---> Using cache
 ---> c1603397aeb5
Step 3/5 : WORKDIR /opt/
 ---> Using cache
 ---> 10t23827358f
Step 4/5 : COPY . /opt/
 ---> cei0c655d1971
Step 5/5 : CMD ["sleep","66666666"]
 ---> Running in b1o1bd2833bf
Removing intermediate container b1e1bdc803bf
 ---> 811de39aad48
Successfully built a12dekcaad48
Successfully tagged ignore:latest
  • 验证
[root@wangyanglinux /opt/2021/ignore]# docker run --rm -it  ignore sh
/opt # ls -a
.             ..            info.md       jenkins_home
/opt # ls -a jenkins_home/
.     ..    mark
/opt # ls -a jenkins_home/mark/
.   ..
/opt # 

附件:自用测试 ignore 的文件,下载地址:https://cloudmessage.top/upload/2022/03/ignore-3b03950be5524edca529e298fbcc5618.tar.gz

0

评论区