写点什么

Docker 这么火,但你真的会写 Dockerfile 吗?【下】

  • 2020-03-10
  • 本文字数:1557 字

    阅读完需:约 5 分钟

Docker 这么火,但你真的会写 Dockerfile 吗?【下】

本文是 Dockerfile 编写教程下半部分:Dockerfile 是应用一系列自定义的命令和格式构成文本文件从而简化镜像构建的过程。但如果处理不当,也会跌坑里~ Caicloud 独家奉献 Dockerfile 的 best practice。秘笈拿好,保你出坑~

一个容器只放一个应用

在一个 Container 中安装多个应用既使得镜像更大又使得可读性和逻辑性更差。所以类似一个函数只干一件事的思想,一个 Container 也只应该放一个应用。

合理使用 CMD 和 ENTRYPOINT 命令

CMD 和 ENTRYPOINT 都能用来指定开始运行的程序,而且这两个命令都有两种不用的语法:


CMD foo a b c
复制代码


或者:


CMD [“foo”, “a”, “b”, “c”]
复制代码


对于第一种语法,docker 会自动加入“/bin/sh –c”到命令中,这样就有可能导致意想不到的行为。为了避免这种行为,我们推荐所有的 CMD 和 ENTRYPOINT 都应该使用第二种语法。


如果两个同时使用,请确定确定他们的含义没有错误。一般来说需要两个同时使用的情况只有 ENTRYPOINT 指定需要运行的 binary,CMD 给出运行的默认参数。

挑选合适的基础镜像

一个合适的基础镜像是能满足运行应用所需要的最小的镜像。这里包括


  • 如果不需要操作系统,那么使用 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 命令

1.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/thingsRUN 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 删了

    • 拷贝的临时文件

    • 安装产生的中间结果


    本文转载自才云 Caicloud 公众号。


    原文链接:https://mp.weixin.qq.com/s/wy2wn0NMNuK3aDoNGj_7nQ


    2020-03-10 21:24877

    评论

    发布
    暂无评论
    发现更多内容

    ChemDraw可以绘制哪些物质?ChemDraw破解补丁版下载安装 Mac/win

    Rose

    ChemDraw破解版 ChemDraw化学绘图 ChemDraw下载安装

    flowjo 10 for mac流式细胞分析 详细安装破解教程 支持m1/m2/intel

    Rose

    流式细胞分析软件 FlowJo 10破解版 FlowJo Mac版 FlowJo 安装教程

    IntelliJ IDEA 2019 mac破解版 含IDEA 2019永久密钥 附IDEA 2019中文版设置教程

    Rose

    IntelliJ IDEA 2019 IntelliJ IDEA 2019密钥 编程软件 IDEA 2019

    如何定量分析 Llama 3,大模型系统工程师视角的 Transformer 架构

    百度Geek说

    大模型 Llama3

    链路级资损防控之资损字段防控实践|得物技术

    得物技术

    最佳实践 测试 资损防控 企业号2024年7月PK榜

    LED异型显示屏:创新设计与市场需求的完美融合

    Dylan

    设计 应用 LED LED显示屏 市场

    科学文献管理软件EndNote 21功能介绍 含(EndNote 21激活码)

    Rose

    文献管理工具 EndNote 21下载 EndNote 21破解版 EndNote 21授权码

    GraphPad Prism科技绘图与数据分析

    Rose

    GraphPad Prism破解版 科学绘图和统计分析 GraphPad Prism下载

    Magnet for mac v2.12.0中文免激活版 支持多种不同方式的窗口布局模式

    Rose

    Magnet破解版 Magnet Mac下载 苹果电脑分屏软件 macOS窗口管理

    担心异构数据库迁移踩“坑”?听听大咖们怎么说

    YashanDB

    yashandb 崖山数据库 崖山DB

    豆包,大模型的磁力三重奏

    脑极体

    AI

    职场<火焰杯>测试开发大赛证书已开放下载!

    测试人

    软件测试

    微软Azure遭遇DDoS攻击,全球云服务再次敲响警钟!

    网络安全服务

    微软 azure 云服务 DDoS DDoS 攻击

    领域驱动设计:问卷schema的原理

    XIAOJUSURVEY

    schema 领域驱动 问卷模型 领域模型 UIschema

    Microsoft PowerPoint 2019 for Mac永久使用版 支持Inte.m1.m2.m3安装

    Rose

    PowerPoint 2019 ppt2019下载 PowerPoint 2019 破解

    视角 | 麻省理工学院提出出温度计校准法,专治AI大模型过度自信

    硅纪元

    以太坊创始人 Vitalik Buterin 2024 年 EDCON 演讲解析:回顾十年历程,展望下一个十年

    区块链软件开发推广运营

    dapp开发 区块链开发 链游开发 NFT开发 公链开发

    告别手动错误,NineData自动化平台保障数据库变更零失误

    NineData

    数据库 dba NineData 变更一致性 多环境结构

    Pura 70系列AI修图大师再上新!小艺AI扩图开启魔幻新体验

    极客天地

    PDF解析,还能做得更好

    合合技术团队

    PDF 大模型 文档解析

    Downie 4 v4.7.24最新中文版下载 永久使用 支持M1.M2.M3芯片安装

    Rose

    Downie 4许可证 Mac视频下载器 Downie 4下载 Downie 4使用教程

    品牌与分类:解析京东商品详情API中的品牌与分类信息

    技术冰糖葫芦

    API 安全 API 文档 API 测试 API 优先

    是你!就是你!我们的黄金写手!

    Zilliz

    人工智能 大数据 Milvus Zilliz 大语言模型

    什么情况下你能接受 996

    王中阳Go

    Go 工作 面经

    最高可管理 10K 实例的 InstanceSet 是什么?

    小猿姐

    数据库 Kubernetes 云原生

    BetterTouchTool for mac触摸板增强神器下载 bettertouchtool破解版详细使用教程

    Rose

    BetterTouchTool破解 BetterTouchTool教程 Mac触控板增强工具

    职场<火焰杯>测试开发大赛证书已开放下载!

    霍格沃兹测试开发学社

    Docker 这么火,但你真的会写 Dockerfile 吗?【下】_语言 & 开发_才云科技_InfoQ精选文章