HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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:24715

    评论

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

    地信领域最高奖!YashanDB首获2024地理信息科技进步奖一等奖

    Geek_2d6073

    华为云Flexus X实例3大优势,828企业上云优选产品

    YG科技

    一次Java性能调优实践【代码+JVM 性能提升70%】

    EquatorCoco

    Java JVM

    答应我,在vue中不要滥用watch好吗?好的

    不在线第一只蜗牛

    前端 Vue 3

    ​共筑国产数据库新生态!YashanDB与华瑞指数云ExponTech达成战略合作

    Geek_2d6073

    华为云Flexus X实例云上管理痛点,828首选上云产品之一

    轶天下事

    基于 RocketMQ 的云原生 MQTT 消息引擎设计

    阿里巴巴云原生

    阿里云 RocketMQ 云原生

    开箱即用,AISBench测试展示英特尔至强处理器的卓越推理性能

    E科讯

    基于STM32设计的酒精检测仪

    DS小龙哥

    9月月更

    华为云Flexus X实例亮相828,企业数字化专场优选云服务器

    轶天下事

    服务稳定性保障的五大误解

    巴辉特

    运维 SRE 服务稳定性建设 服务稳定性保障

    DAPP合约NFT卡牌盲盒商城系统功能开发设计

    V\TG【ch3nguang】

    住宅代理和数据中心代理如何选择?

    IPIDEA全球HTTP

    万界星空科技MES系统生产过程控制功能详解

    万界星空科技

    工业互联网 制造业 mes 万界星空科技 生产管理MES系统

    新一代柔性云服务!华为云Flexus X实例亮相828企业节

    轶天下事

    【YashanDB知识库】主备延迟故障分析方法

    YashanDB

    yashandb 崖山数据库

    828优选华为云Flexus X实例,找准中小企业上云“切入口”

    YG科技

    Flink Forward Asia 2024 议题征集令|探索实时计算新边界

    Apache Flink

    Apache 大数据 flink 实时计算 FFA

    中小企业上云好管家!828企业节亮相的华为云Flexus X实例让上云更便捷

    轶天下事

    828云服务器如何选?企业云上管理认准华为云Flexus X实例

    YG科技

    破解企业上云难题,828优选华为云Flexus X实例加速云上管理

    轶天下事

    Peet's Coffee与观测云跨界合作,为伙伴们呈现双重喜悦

    观测云

    中秋节

    加速企业上云管理黑科技,华为云Flexus X实例首次亮相828企业节

    轶天下事

    助力828,华为云Flexus X实例加速企业云上管理

    轶天下事

    StarRocks Lakehouse 快速入门——Apache Iceberg

    StarRocks

    Apache 数据湖 iceberg

    网站必须做IPv6改造吗?不做IPv6改造有什么影响?

    国科云

    Java Streams 的潜力

    FunTester

    MacTalk 测评通义灵码,如何实现“微信表情”小功能?

    阿里云云效

    阿里云 云原生 通义灵码

    跨越山海,台湾媒体点赞《黑神话:悟空》云游戏服务

    轶天下事

    从CSM到A-CSM:不断提升的探索之路

    ShineScrum捷行

    MacTalk 测评通义灵码,如何实现“微信表情”小功能?

    阿里巴巴云原生

    阿里云 云原生 通义灵码

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