Dockerfile 书写原则
1. 单一职责
由于容器的本质是进程,一个容器代表一个进程,因此不同功能的应用应该尽量拆分为不同的容器,每个容器只负责单一业务进程。
2. 提供注释信息
Dockerfile 也是一种代码,我们应该保持良好的代码编写习惯,晦涩难懂的代码尽量添加注释,让协作者可以一目了然地知道每一行代码的作用,并且方便扩展和使用。
3. 保持容器最小化
应该避免安装无用的软件包
4. 合理选择基础镜像
容器的核心是应用,因此只要基础镜像能够满足应用的运行环境即可。例如一个Java类型的应用运## 行时只需要JRE,并不需要JDK,因此我们的基础镜像只需要安装JRE环境即可
5. 使用 .dockerignore 文件
忽略一些不需要参与构建的文件,从而提升构建效率
6. 尽量使用构建缓存
Docker 构建过程中,每一条 Dockerfile 指令都会提交为一个镜像层,下一条指令都是基于上一条指令构建的。如果构建时发现要构建的镜像层的父镜像层已经存在,并且下一条命令使用了相同的指令,即可命中构建缓存
命中缓存的原则:
- 从当前构建层开始,比较所有的子镜像,检查所有的构建指令是否与当前完全一致,如果不一致,则不使用缓存
- 一般情况下,只需要比较构建指令即可判断是否需要使用缓存,但是有些指令除外(例如ADD和COPY)
- 对于ADD和COPY指令不仅要校验命令是否一致,还要为即将拷贝到容器的文件计算校验和(根据文件内容计算出的一个数值,如果两个文件计算的数值一致,表示两个文件内容一致 ),命令和校验和完全一致,才认为命中缓存
7. 正确设置时区
我们从 Docker Hub 拉取的官方操作系统镜像大多数都是 UTC 时间(世界标准时间)8. 使用国内软件源加快镜像构建速度
9. 最小化镜像层数
在构建镜像时尽可能地减少 Dockerfile 指令行数