使用.dockerignore 文件

.dockerignore类似于git.gitignore文件,在其中指定构建镜像时需要忽略的文件或目录。

避免安装不必要的软件包

目的是降低复杂性、依赖性、文件大小以及构建时间。

每个容器都只跑一个进程

在大多数情况下,每个容器应该只单独跑一个程序。解耦应用到多个容器使其更容易横向扩展和重用。

最小化层

每执行一条指令,都会有一次镜像的提交。镜像是分层结构的,对于 Dockerfile,应该找到可读性和最小化层之间的平衡。

多行参数排序

安装包时,尽量通过字母顺序来排序,这样可以避免安装包的重复并且更容易更新列表,另外可读性也会更强。

RUN apt-get update && apt-get install -y \
  bzr \
  cvs \
  git \
  mercurial \
  subversion

利用缓存

镜像构建过程中会逐行执行 Dockerfile 中的指令,默认会使用缓存,如果不想使用,则可以在docker build时添加--no-cache选项

  • ADD 和 COPY 会检查添加到镜像的文件, 而RUN apt-get update -y命令则只检查命令是否匹配
  • 为了有效利用缓存,需要尽量把不需要变动的指令放在 Dockerfile 的前面,尽量在末尾修改 Dockerfile 文件

Dockerfile 指令

  • FROM:尽量使用官方镜像库作为基础镜像
  • RUN:为保持可读性、方便理解、可维护性,把长或者复杂的 RUN 语句使用\分隔符分成多行
  • 不建议RUN apt-get update独立成行,否则后续有包要更新,该命令不会被执行
  • 标准写法:RUN apt-get update && apt-get install -y package-bar package-foo
  • CMD: 推荐使用 CMD [“executable”, “param1”, “param2”…]这种格式,CMD [“param”, “param”]则配合 ENTRYPOINT 使用
  • EXPOSE: Dockerfile 指定要公开的端口,使用 docker run 时指定映射到宿主机的端口即可
  • ENV: 为了使新的软件更容易运行,可以使用 ENV 更新 PATH 变量。如 ENV PATH /usr/local/nginx/bin:$PATH
  • ADD or COPY:ADD 比 COPY 多一些特性「tar 文件自动解包和支持远程 URL」,不推荐添加远程 URL

如不推荐这种方式:

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

推荐使用 curl 或者 wget 替换,使用如下方式:

RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.gz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

如果不需要添加 tar 文件,推荐使用 COPY。

参考:

https://www.docker.org.cn/dockerppt/114.html