Dockerfile最佳实践
- 建议所有的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中的指令,而且一旦缓存失效,后续命令将不能使用缓存。为了有效地利用缓存,需要尽量将所有的Dockerfile文件中相同的部分都放在前面,而将不同的部分放在后面。
- 优先使用COPY而非ADD指令。和ADD相比,COPY 功能简单,而且也够用。ADD可变的行为会导致该指令的行为不清晰,不利于后期维护和理解。
- 推荐将CMD和ENTRYPOINT指令结合使用,使用execl格式的ENTRYPOINT指令设置固定的默认命令和参数,然后使用CMD指令设置可变的参数。
- 尽量使用Dockerfile共享镜像。通过共享Dockerfile,可以使开发者明确知道Docker镜像的构建过程,并且可以将Dockerfile文件加入版本控制,跟踪起来。
- 使用.dockerignore忽略构建镜像时非必需的文件。忽略无用的文件,可以提高构建速度。
- 使用多阶段构建。多阶段构建可以大幅减小最终镜像的体积。