[转帖].dockerignore

dockerignore · 浏览次数 : 0

小编点评

**dockerignore 文件的作用** dockerignore 文件是用于在 Docker 构建镜像时忽略掉特定文件或文件夹的文件列表的配置文件。它类似于项目中的 .gitignore 文件,但用于 docker 构建镜像。 **文件的作用** * 忽略掉在构建镜像之前已经构建好的文件或文件夹。 * 可以避免将不必要的文件上传到 docker 服务端,从而提高镜像构建速度和网络带宽的效率。 * 可以避免将敏感文件及其他不需要的文件打包到镜像中,从而提高镜像的安全性。 **格式** dockerignore 文件使用类似于 .gitignore 文件的格式,每行为一个条目。每行为包含以下格式: ``` ``` * `` 是要忽略的文件或文件夹的路径。 * `` 是用于匹配文件或文件夹的正则表达式。 **注意事项** * 使用 .dockerignore 文件时,请注意规则的顺序。后面的匹配规则会覆盖前面的匹配规则。 * 如果两个匹配语法规则有包含或重叠关系,那么后续匹配规则将准。 * 使用 .dockerignore 文件时,不要包含绝对路径。 * 最终,生成的镜像大小可能与不使用 .dockerignore 文件时的镜像大小相比有所不同,但通常会更小。 **示例** 假设我们有一个名为 `node_modules` 的文件夹,它包含许多不必要的文件。如果我们将其加入 `dockerignore` 文件中,则在构建镜像时该文件夹将被忽略。 ``` .dockerignore node_modules/ ``` **用法** 1. 创建一个名为 `dockerignore` 的文件。 2. 在文件中添加要忽略的文件或文件夹的路径和正则表达式。 3. 在 `docker build` 命令中使用 `-i`选项指定 `dockerignore` 文件路径。 4. 构建镜像时,dockerignore 文件将覆盖 `dockerignore` 文件中的规则。

正文

https://www.cnblogs.com/panpanwelcome/p/12603658.html

 

 

1
2
3
4
删除git 缓存
git rm -r --cached .
git add .
git commit -m 'update .gitignore'

 

  

.dockerignore 文件从入门到实践

.dockerignore 文件的作用类似于 git 工程中的 .gitignore 。不同的是 .dockerignore 应用于 docker 镜像的构建,它存在于 docker 构建上下文的根目录,

用来排除不需要上传到 docker 服务端的文件或目录。

docker 在构建镜像时首先从构建上下文找有没有 .dockerignore 文件,如果有的话则在上传上下文到 docker 服务端时忽略掉 .dockerignore 里面的文件列表。

 

好处是:

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

 

.dockerignore 文件编写方法

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

  • 每行为一个条目;
  • 以 # 开头的行为注释;
  • 空行被忽略;
  • 构建上下文路径为所有文件的根路径;

 

文件匹配规则具体语法如下:

 

 

 

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

1
2
3
*.md
!README*.md
README-secret.md

将根路径下所有以 .md 结尾的文件排除,以 README 开头 .md 结尾的文件保留,但是 README-secret.md 文件排除。

 

1
2
3
*.md
README-secret.md
!README*.md

将根路径下所有以 .md 结尾和名称为 README-secret.md 的文件排除,但所有以 README 开头 .md 结尾的文件保留。这样的话 README-secret.md 依旧会被保留,并不会被排除,因为 README-secret.md 符合 !README*.md 规则。

使用案例
前段时间帮前端同学写了一个 Dockerfile,Dockerfile 放在 git 仓库根路径下,发现 git 工程中有很多真正应用跑起来用不到的文件,如果直接在 Dockerfile 中使用 COPY 或 ADD 指令拷贝文件,那么很显然会把很多不需要的文件拷贝到镜像中,从而会拖慢构建镜像的过程,产生的镜像也比较臃肿。

解决方法就是编写 .dockerignore 文件,忽略掉不需要的文件,然后放到 docker 构建上下文的根路径下。

1
2
3
4
5
6
.git
_mockData
deleted
email-templates
script
static

  

Dockerfile:

1
2
3
4
5
6
7
8
9
FROM node:8-alpine
 
COPY . /app/node
WORKDIR /app/node
RUN yarn install
 
EXPOSE 8026
 
CMD ["yarn""run""tool-dev"]

  

 

使用 .dockerignore 前后上传到 docker 服务端的构建上下文大小对比:

使用前(73.36MB):

1
2
3
[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):

1
2
3
[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

  

参考资料

https://docs.docker.com/engine/reference/builder/#dockerignore-file

 

.dockerignore 文件的作用

 

类比

在项目中,我们见过很多各式各样的 ignore 文件。

比如使用 .gitignore 来忽略掉你不想追踪的文件:https://git-scm.com/docs/gitignore

使用 .npmignore 来忽略你在发布包时不想发布的文件:https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package

那么 .dockerignore 文件是起什么作用的呢,不管是在 docker build 过程中,还是 docker run 的过程中,有没有这个文件好像并没有什么很大的影响,存在感不强的一个文件。

 

首先需要理解一下 镜像构建上下文(context) 的概念,参见另一篇博文:docker build 命令后 . 号的意思

理解了这个概念就明白,当我们在 docker build 的过程中,

首先会将指定的上下文目录打包传递给 docker引擎,而这个上下文目录中可能并不是所有的文件我们都会在 Dockerfile 中使用到,那么这个时候就可以在 .dockerignore 文件中指定在传递给 docker引擎 时需要忽略掉的文件或文件夹。

 

举栗说明~
比如我们在前端项目中,node_modules 文件夹在构建镜像过程中如果用不到,但是又异常庞大,那么向 docker引擎 传递其实是并没有必要的(其实大家电脑性能都这么好,也不在乎这几秒钟了。。。只是举个例子,可以提升镜像构建速度),这个时候就可以将 node_modules 文件夹加入 .dockerignore 文件中。

 

如下所示,速度提升还是很明显的。
加入前:

 

 

 

 加入后:

 

与[转帖].dockerignore相似的内容:

[转帖].dockerignore

https://www.jianshu.com/p/58eb04327570 类似于git中的.gitignore,忽略某些文件;docker是CS架构,由客户端docker-cli和服务端docker daemon组成;docker build时,客户端会将context中的文件全部发送给服务端。

[转帖].dockerignore

https://www.cnblogs.com/panpanwelcome/p/12603658.html 1 2 3 4 删除git 缓存 git rm -r --cached . git add . git commit -m 'update .gitignore' .dockerignore

[转帖]一文看懂 .dockerignore

https://dhcp.cn/k8s/docker/dockerignore.html#dockerignore-%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D 一文看懂 .dockerignore 在 dockerfile 同级目录中创建名为 .dockerignore

[转帖]

Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

[转帖]

https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

[转帖]ISV 、OSV、 SIG 概念

ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww

[转帖]HTTPS中间人攻击原理

https://www.zhihu.com/people/bei-ji-85/posts 背景 前一段时间,公司北京地区上线了一个HTTPS防火墙,用来监听HTTPS流量。防火墙上线之前,邮件通知给管理层,我从我老大那里听说这个事情的时候,说这个有风险,然后意外地发现,很多人原来都不知道HTTPS防

[转帖]关于字节序(大小端)的一点想法

https://www.zhihu.com/people/bei-ji-85/posts 今天在一个技术群里有人问起来了,当时有一些讨论(不完全都是我个人的观点),整理一下: 为什么网络字节序(多数情况下)是大端? 早年设备的缓存很小,先接收高字节能快速的判断报文信息:包长度(需要准备多大缓存)、地

[转帖]awk提取某一行某一列的数据

https://www.jianshu.com/p/dbcb7fe2da56 1、提取文件中第1列数据 awk '{print $1}' filename > out.txt 2、提取前2列的文件 awk `{print $1,$2}' filename > out.txt 3、打印完第一列,然后打