- 建议所有的 Dockerfile 指令大写,这样做可以很好地跟在镜像内执行的指令区分开来。
- 在选择基础镜像时,尽量选择官方的镜像,并在满足要求的情况下,尽量选择体积小的镜像。目前,Linux 镜像大小有以下关系:busybox < debian < centos < ubuntu 。最好确保同一个项目中使用一个统一的基础镜像。如无特殊要求,可以使用 debian:jessie 或者 alpine.
- 在构建镜像时,删除不需要的文件,只安装需要的文件,保持镜像干净、轻量
- 使用更少的层,把相关的内容放到一个层,并使用换行符进行分割。这样可以进一步减少镜像的体积,也方便查看镜像历史。
- 不要在 Dockerfile 中修改文件的权限。因为如果修改文件的权限,Docker 在构建时会重新复制一份,这会导致镜像体积越来越大。
- 给镜像打上标签,标签可以帮助你理解镜像的功能,例如:
docker build -t="nginx:3.0-onbuild"
- FROM 指令应该包含 tag,例如使用:
FROM debian:jessie
而不是FROM debian
。 - 充分利用缓存。Docker 构建引擎会顺序执行 Dockerfile 中的指令,而且一旦缓存失效,后续指令将不能使用缓存。为了有效地利用缓存,需要尽量将所有的 Dcokerfile 文件中相同的部分都放在前面,而将不同的部分放在后面
- 优先使用
COPY
而非ADD
指令,和 ADD 相比, COPY 功能简单,而且也够用。ADD 可变的行为会导致该指令的行为不清晰,不利于后期维护和理解 - 推荐将 CMD 和 ENTRYPOINT 指令结合使用,使用 execl 格式的 ENTRYPOINT 指令设置固定的默认命令和参数,然后使用 CMD 指令设置可变的参数。
- 尽量使用 Dockerfile 共享镜像。通过共享 Dockerfile,可以使开发者明确知道 Docker 镜像的构建过程,而且可以将 Dockerfile 文件加入版本控制,追踪起来。
- 使用 .dockerignore 忽略构建镜像时非必需的文件。忽略无用的文件,可以提高构建速度。
- 使用多阶构建。多阶构建可以大幅减小最终镜像的体积。例如,COPY 指令中可能包含一些安装包,安装完成之后这些内容就废弃掉。