Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,一个Dockerfile里面包含了构建整个image的完整命令。Docker通过docker build执行Dockerfile中的一系列命令自动构建image。
Dockerfile其语法非常简单,详情参考实践文档
规范
- 精简原则,减少代码复杂性以及相关依赖关系和大小
- 构建缓存,若不想使用缓存,可通过docker build --no-cache=true命令
- 对于From,尽量使用官方的镜像作为基础
- 对于特定容器,可以使用标签进行定义,标签以键值对形式出现,若包含空格,则用“包括,若标签对象不唯一,则后者会覆盖前者。
- Run命令不易过多过长,命令过长可以用\换行,多个命令最好不要分开执行,浪费资源并且费时
- 如需要安装软件包,最好将apt-get upgrade和apt-get install结合使用,类似于清除缓存的作用,避免安装到缓存内过时的版本,如单独使用,kennel导致缓存失效或者后续安装指令失败。
- 如果想镜像构建过程中产生任何错误都失败则应避免使用|而转为用&&
- 端口暴露尽量使用传统端口,比如Apache Web 的80
- 习惯为容器添加环境变量,通常用于为应用程序提供必要的版本信息和环境变量
- 对于ADD和COPY,两者类似,但是COPY透明度更高,ADD支持将文件解压以及对于URL的使用,但是对于镜像来讲大小格外重要,所以应该尽量使用curl或者wget代替ADD来进行远程对包的提取,所以对于大多数不需要进行tar自动提取的项目来讲,建议始终使用COPY,并将之放置于最后,可以有效减少缓存无效的数量
- ENTRYPOINT的最好用途是设置镜像的主命令,用CMD作为参数,这样就可以像是镜像命令一样运行。如:ENTRYPOINT["s3cmd"]
CMD ["--help"]
实际运行时也可以通过命令行覆盖CMD参数 - WORKDIR,应当使用绝对路径作为WORKDIR,便于阅读并且易于维护