Docker 手册(三):Dockerfile 最佳实践

使用.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值