本文是 Dockerfile 编写教程下半部分:Dockerfile 是应用一系列自定义的命令和格式构成文本文件从而简化镜像构建的过程。docker
一个容器只放一个应用网络
在一个 Container 中安装多个应用既使得镜像更大又使得可读性和逻辑性更差。因此相似一个函数只干一件事的思想,一个 Container 也只应该放一个应用。app
合理使用 CMD 和 ENTRYPOINT 命令curl
CMD 和 ENTRYPOINT 都能用来指定开始运行的程序,并且这两个命令都有两种不用的语法:函数
CMD foo a b c
或者:优化
CMD [“foo”, “a”, “b”, “c”]
对于第一种语法,docker 会自动加入“/bin/sh –c”到命令中,这样就有可能致使意想不到的行为。为了不这种行为,咱们推荐全部的 CMD 和 ENTRYPOINT 都应该使用第二种语法。
若是两个同时使用,请肯定肯定他们的含义没有错误。通常来讲须要两个同时使用的状况只有 ENTRYPOINT 指定须要运行的 binary,CMD 给出运行的默认参数。url
挑选合适的基础镜像操作系统
一个合适的基础镜像是能知足运行应用所须要的最小的镜像。这里包括code
若是不须要操做系统,那么使用 scratch 镜像就好;能使用小的镜像就不要使用大的。教程
指定的基础镜像须要有版本号,好比 debian 就有不少不一样的版本。不指定版本号就永远用的 latest,这个会一直变。由于不一样版本的系统和安装的软件有兼容性问题,因此不指定版本会使得 Dockerfile 不稳定。
若是多个镜像须要安装一系列相同的软件,那么能够考虑新建一个基础镜像来安装这些软件。之后的镜像直接使用新生成的基础镜像就好
优化 apt-get 相关操做
将多个 apt-get 操做合成一个既能减小 layer 数,又能更好的管理安装的东西(避免重复安装)。在 apt-getinstall 以前,最好使用 apt-getupdate 这样能够保证安装的程序是最新版本的。在安装完以后最好使用 apt-get clean 来清理中间结果。下面给出了一个比较推荐的 apt-get 操做的格式:
RUN apt-get update && apt-get install -y \ package-bar \ package-baz \ package-foo && \ apt-get clean
须要安装的软件最好按字母序排列,这样之后要查找或者增长新的软件方便。
合理使用ADD 命令
一、ADD命令和 COPY 命令在很大层度上功能是同样的。可是 COPY 语义更加直接,因此咱们推荐尽可能使用 COPY 命令。惟一例外的是 ADD 命令自带解压功能,若是须要拷贝并解压一个文件到镜像中,那么咱们可使用 ADD 命令。除此以外,咱们都推荐使用 COPY 命令。
二、
ADD http://example.com/big.tar.xz /usr/src/things/ RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things RUN make -C /usr/src/things all
咱们不推荐使用 ADD 命令来获取网络资源。网络资源应该使用 RUN wget 或者 curl 命令来获取。由于使用 wget 或者 curl 更加方便清理存储的中间文件和临时文件,同时这样也能使用更少的 layer 来完成一样的事情。好比命令:
能够由如下命令代替:
RUN mkdir -p /usr/src/things \ && curl -SL http://example.com/big.tar.xz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things all
不要设置公共端口
Dockerfile 支持 mapping 私有端口和公共端口(好比命令 EXPOSE 80:8080),可是咱们不推荐 mapping 公共端口由于 Container 在编译的时候没法肯定这个公共端口在它运行的环境中是否已经被其余程序占用。
清理没用的中间结果
中间结果能够包括:
安装的对最后应用没有的软件。好比安装 foo 须要软件 bar,可是最后的应用不须要 bar。那么在安装完成 foo 以后就能够把 bar 删了。
拷贝的临时文件
安装产生的中间结果
若是须要转载,请联系咱们,尊重知识产权人人有责;0