前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker 手册(三):Dockerfile 最佳实践

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

作者头像
简说基因
发布2022-04-12 14:43:17
3100
发布2022-04-12 14:43:17
举报
文章被收录于专栏:简说基因简说基因

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 简说基因 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用.dockerignore 文件
    • 避免安装不必要的软件包
      • 每个容器都只跑一个进程
        • 最小化层
          • 多行参数排序
            • 利用缓存
              • Dockerfile 指令
              相关产品与服务
              容器镜像服务
              容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档