使用.dockerignore 文件
.dockerignore
类似于git
的.gitignore
文件,在其中指定构建镜像时需要忽略的文件或目录。
避免安装不必要的软件包
目的是降低复杂性、依赖性、文件大小以及构建时间。
每个容器都只跑一个进程
在大多数情况下,每个容器应该只单独跑一个程序。解耦应用到多个容器使其更容易横向扩展和重用。
最小化层
每执行一条指令,都会有一次镜像的提交。镜像是分层结构的,对于 Dockerfile,应该找到可读性和最小化层之间的平衡。
多行参数排序
安装包时,尽量通过字母顺序来排序,这样可以避免安装包的重复并且更容易更新列表,另外可读性也会更强。
代码语言:javascript复制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
如不推荐这种方式:
代码语言:javascript复制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 替换,使用如下方式:
代码语言:javascript复制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