通用的指导原则
-
容器应该是朝生暮死的
也就是容器应该可以随时被终止和销毁, 能够快速的使用一个新的容器替代老容器 -
使用.dockerignore文件
为了提高编译效率, 使用.dockerignore文件设置忽略文件 -
避免安装不必要的软件包
为了减小复杂性, 依赖关系, 文件尺寸和编译次数, 尽量避免安装额外的不必要的软件包 -
每一个容器只允许一个进程
将应用程序解耦为多个容器 -
减少层数
-
把多行参数排序, 如
RUN apt-get update && apt-get install -y \
bzr \
cvs \
git \
mercurial \
subversion
-
编译缓存
使用--no-cache=true可以不使用缓存缓存使用策略
- 如果基础镜像在缓存中, 那么下一条指令和该基础镜像的所有子镜像对比, 查看是否有使用完全相同的命令构建的子镜像, 如果有则使用缓存的子镜像, 否则缓存失效.
- 大部分的情况下简单的比较指令就完全够用了, 但是一些特殊的指令需要一些特殊的检查.
- 对于ADD和COPY指令, 镜像中的文件都会计算一个校验和, 但最近的修改和访问时间不会计算在校验和中, 然后与已有镜像中的文件对比, 如果有任何修改, 缓存就失效了
- 除了ADD和COPY指令, 缓存检查不会检查容器中的其他的文件进行缓存校验了
网友评论