[转帖]一文看懂 .dockerignore

一文,dockerignore · 浏览次数 : 0

小编点评

**Docker 的 .dockerignore 文件** `.dockerignore` 文件用于在构建 Docker 镜像时指定哪些文件和目录不应被包含。它使用类似 `gitignore` 的语法来定义文件和目录的匹配规则。 **语法** `.dockerignore` 文件的语法如下: ``` # 文件或目录的路径和文件名 # 可以使用绝对路径、相对路径或通配符字符串 ``` **例子** 以下是一个示例 .dockerignore 文件: ``` # 注释 */temp*/*/temp*temp?1234 # 排除根目录中的所有 .go 文件 **/temp* # 排除所有 .md 文件 *.md # 递归地忽略所有 .go 文件 **/go/*.go # 排除所有以 .md 开头的文件 *.md!README.md # 排除包含 README 文件的目录 *.md/README.md ``` **用法** 1. 创建一个名为 `.dockerignore` 的文件。 2. 在文件中添加文件和目录的路径和文件名。 3. 在 Dockerfile 中使用 `RUN` 或 `ADD` 指令使用该文件进行忽略。 **注意事项** * `&` 符可用于使用通配符。 * `#` 符可用于定义注释。 * `*` 和 `?` 符号可用于匹配任何数量的目录或文件名。 * `!` 符号可用于排除指定文件。 * `*` 和 `!` 符不可单独使用。 **示例** 假设我们有一个名为 `Dockerfile` 的 Docker 文件,它包含以下代码: ```dockerfile ADD book/docs/.vuepress/dist/ /usr/share/nginx/html/ RUN echo "hello world" > index.html ``` 如果我们创建一个名为 `.dockerignore` 的文件,并将其内容为: ``` **/go/*.go ``` 那么,当我们构建 Docker 镜像时,`Dockerfile` 中的 `ADD` 指令就不会复制 `go` 文件到镜像中。

正文

https://dhcp.cn/k8s/docker/dockerignore.html#dockerignore-%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D

 

一文看懂 .dockerignore

在 dockerfile 同级目录中创建名为 .dockerignore 的文件,用法与 .gitignore 类似,可以实现在构建镜像的时,不将某些文件夹或文件打入到镜像中。

以下示例会过滤 images、media 目录,以及 png、jpg 图片。

  • .dockerignore
*/images/
*/media/
*.png
*.jpg
1
2
3
4

我们来看下这个示例,首先看下 dockerfile ADD 的内容,重点是 ADD book/docs/.vuepress/dist/ /usr/share/nginx/html/ 这一行。

  • dockerfile
FROM nginx:alpine
WORKDIR /usr/share/nginx/html
ADD book/docs/.vuepress/dist/ /usr/share/nginx/html/
ADD etc/nginx/nginx.conf /etc/nginx/nginx.conf
ADD etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
ADD etc/localtime /etc/localtime
EXPOSE 80
1
2
3
4
5
6
7

这是 book/docs/.vuepress/dist/other/else/ 的目录结构,包含一个 media 文件夹

~$ ll other/else/
total 16
-rw-r--r--@ 1 spark  staff   1.6K  8  1 16:15 enable-1000mbps.md
-rw-r--r--@ 1 spark  staff   1.8K  7 27 17:57 max-values-per-tag.md
drwxr-xr-x@ 8 spark  staff   256B  8  1 16:11 media
1
2
3
4
5

这是构建镜像后,运行容器并查看 other/else 目录的结构,可以看到其下没有 media 目录,已经被排除了。

~$ docker exec a95e5556c87c pwd
/usr/share/nginx/html
~$ docker exec a95e5556c87c ls -lh other/else
total 68K
-rw-r--r--    1 root     root       31.6K Aug  1 16:20 enable-1000mbps.html
-rw-r--r--    1 root     root       32.5K Aug  1 16:20 max-values-per-tag.html
~$
1
2
3
4
5
6
7

看完示例,接下来我们翻译一下 Docker 官方的 .dockerignoreopen in new window 的文档,不是硬翻译,带了自己的理解。

#.dockerignore 详细介绍

在 docker build 过程中,Docker CLI 将 context 发送到 docker 守护进程之前,它会查看根目录中名为 .dockerignore 的文件。

如果 .dockerignore 存在,Docker CLI 将修改 context 以排除文件和目录。

这样可以将不必要的文件不打入到 Docker 镜像中,让 docker 镜像保持干净。

Docker CLI 将 .dockerignore 文件解释为换行符分隔的文件,也就是一行一个匹配规则。

context 的根目录为项目的根目录,也就是 dockerfile 的同级目录。你可以使用 / 开头的绝对路径,也可以使用相对路径。 比如 /foo/bar 和 foo/bar 效果是一样的。

在 .dockerignore 中,# 开头的行被认为是注释。

下面是一个 .dockerignore 文件示例:

# 注释
*/temp*
*/*/temp*
temp?
1
2
3
4

以下是对该 .dockerignore 文件的解释:

匹配规则匹配结果
# comment 忽略
*/temp* 排除根目录中(也就是不包含子目录)目录名称以 temp 开头的文件和目录。例如,排除普通文件 /somedir/temporary.txt,目录 /somedir/temp
*/*/temp* 排除根目录的二级子目录中以 temp 开头的文件和目录。例如,排除 /somedir/subdir/temporary.txt
temp? 排除根目录中名称以 temp 开头,外加一个字符的文件和目录。例如,排除 /tempa 和 /tempb

匹配规则引用了 Go 的 filepath.Matchopen in new window 规则。预处理步骤会删除一行中首尾空格,同时使用 filepath.Cleanopen in new window 会忽略 . 和 .. 。预处理(preprocessing)后为空的行将被忽略。

除了 Go 的 filepath.Match 规则,Docker 还支持一个特殊的通配符字符串 ** 匹配任意数量的目录(包括零)。例如,**/*.go 将排除所有目录中以 .go 结尾的文件,包含根目录。

以 !(感叹号)开头的行用来做例外,也就是说这些行不会被排除,仍然会打入到镜像中。以下是一个 .dockerignore 示例:

*.md
!README.md
1
2

除了 README.md, 所有 Markdown 文件都将排除。

! 异常规则的位置会影响匹配结果:包含指定文件(例如下文示例中的 README-secret.md 匹配的 .dockerignore 的最后一行确定是包含还是排除该文件。看一下这个例子:

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

context 中不包含任何 Markdown 文件,除了 README 开头的 md 、README-secret.md文件。

现在我们看下这个例子:

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

context 中包含 README-secret.md 在内的所有 README 文件,不包含剩下 Markdown 文件。README-secret.md 没有被排除,因为 !README*.md 包含 README-secret.md 并且 !README*.md在最后。

你甚至可以使用 .dockerignore 文件来排除 Dockerfile 和 .dockerignore 文件。这些文件仍然发送到 Deamon 进程,但 ADD 和 COPY 指令不会将它们复制到镜像中。

最后,您可能希望指定要包含在 context 中,而不是排除哪个。为此,请将 * 放在第一行,后跟一个或多个 ! 异常模式。

** 注意事项 **

由于历史原因,. 模式被忽略。

#reference

访客IP 112.36.205.219,您的网络 IPv4 访问优先

本站是个人博客,书写大数据、数据科学等领域的原创学习记录,转载请注明出处

本站运行于 腾讯云 腾讯云 (2核2G云服务器首年40元!)

与[转帖]一文看懂 .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

[转帖]一文看懂家庭宽带光纤是如何入户

目前,家庭宽带普遍实现了光纤入户,入户光纤一般在弱电箱的位置,家庭装修需要预埋网线,才能在后期流畅的使用网络。下文对网线预埋、网线选择、组网方式三个方面说一说。 一、光纤如何入户 1、光纤如何入户 入户光纤是不用家庭用户操心的,运营商在小区附件,一般部署了分光箱等。装机员会从分光箱拉一条皮纤到房子的

[转帖]一文看懂eBPF、eBPF的使用(超详细)

https://zhuanlan.zhihu.com/p/480811707 eBPF(extended Berkeley Packet Filter) 可谓 Linux 社区的新宠,很多大公司都开始投身于 eBPF 技术,如 Goole、Facebook、Twitter 等。 eBPF 究竟有什么

[转帖]一文看懂mysql数据库事务隔离级别

概述 我们都知道除了MySQL默认采用RR隔离级别之外,其它几大数据库都是采用RC隔离级别。那为啥mysql要这样设置呢?其实是MySQL为了规避一个数据复制场景中的缺陷,而选择 Repeatable Read 作为默认隔离级别。不过不同数据库实现方式还是不太一样。 Oracle仅仅实现了RC 和

[转帖]一张图看懂 SQL 的各种 join 用法

https://cloud.tencent.com/developer/article/1954012?areaSource=104001.79&traceId=7WZNP412yK3vh7ebw4th0 发布于2022-03-10 13:54:43阅读 870 下图展示了 LEFT JOIN、RI

[转帖]一个故事看懂计算机操作系统的进化史

https://www.cnblogs.com/xuanyuan/p/14749838.html 计算机 很久很久以前,有一台机器,体型巨大,每秒钟可以进行几千次的加法运算,名震一时,人类给它取了个名字:计算机。 除了加法,它还能计算平方、立方、正弦、余弦,比人类的大脑算得快多了。 许多程序慕名而来

[转帖]一个故事看懂CPU的TLB

https://www.cnblogs.com/xuanyuan/p/15347054.html Hi,我是CPU一号车间的阿Q,还记得我吗,真是好久不见了~ 我所在的CPU是一个八核CPU,就有八个工作车间,那运行起来速度杠杆的~ 虚拟地址翻译 一大早,我们一号车间MMU(内存管理单元)部门的小黑

[转帖]一个故事看懂CPU的SIMD技术

https://www.cnblogs.com/xuanyuan/p/16048303.html 好久不见,我叫阿Q,是CPU一号车间的员工。我所在的CPU有8个车间,也就是8个核心,咱们每个核心都可以同时执行两个线程,就是8核16线程,那速度杠杠滴。 我所在的一号车间,除了负责执行指令的我,还有负

[转帖]陈巍谈芯:一图看懂芯片禁令的目的、范围和影响

https://zhuanlan.zhihu.com/p/572905835 陈巍谈芯:让你一图看懂某国芯片禁令的目的、范围和影响。 感觉这回是“芯片战争”,影响全球半导体产业链。但也是有方法减少影响的。

[转帖]必看!PostgreSQL参数优化

https://www.modb.pro/db/48129 前不久,一个朋友所在的公司,业务人员整天都喊慢。 朋友是搞开发的,不是很懂DB,他说他们应用的其实没什么问题,但是就是每天一到高峰期就办理特别的慢啊,各种堵塞,一堆请求无法完成。他们没有专门的DBA,想找我帮忙看看。 我下班后打开他们的数据