AICon议程上新60%,阿里国际、360智脑、科大讯飞、蔚来汽车分享大模型探索与实践 了解详情
写点什么

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

    评论

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

    基于Flink CDC打通数据实时入湖

    数据社

    签约计划第三季

    大模型轻量化实践路径

    澜舟孟子开源社区

    人工智能 自然语言处理 神经网络 深度学习 预训练模型

    你真的了解Redis的持久化机制吗?

    C++后台开发

    数据库 redis 后端开发 C/C++后台开发 C/C++开发

    金九银十喜提offer!秋招蚂蚁金服Java研发岗四面

    程序员啊叶

    Java 编程 程序员 架构 java面试

    Google Cloud X Kyligence|如何从业务视角管理数据湖?

    Kyligence

    数据湖 智能多维数据库

    不会多线程还想进BAT?精选19道多线程面试题,有答案边看边学

    程序知音

    Java 多线程 面试题 后端技术 BAT面试题

    数据中台建设(四):企业构建数据中台评估

    Lansonli

    大数据 数据中台 7月月更

    手摸手实现Canal如何接入MySQL实现数据写操作监听

    知识浅谈

    MySQ 7月月更

    文档贡献与写作必读-OpenHarmony开发者文档风格指南

    OpenHarmony开发者

    Open Harmony

    官宣,又一上市公司杀入数据库市场

    亚信AntDB数据库

    AntDB 国产数据库 aisware antdb

    深圳见!云原生加速应用构建专场:来看云原生 FinOps、SRE、高性能计算场景最佳实践

    阿里巴巴云原生

    阿里云 云原生 峰会

    从通信延伸到全行业,亚信科技AntDB 7.0蓄势待发

    亚信AntDB数据库

    AntDB 国产数据库 aisware antdb

    SQL 开始日期、结束日期查询

    孙永潮

    Rust P2P网络应用实战-1 P2P网络核心概念及Ping程序

    李明

    rust 网络 Libp2p

    Jenkins 如何玩转接口自动化测试?

    Liam

    测试 jenkins 自动化测试 API 测试框架

    微信公众号借助小程序云函数实现支付功能

    Geek_24ed5f

    签约计划第三季

    StarRocks 2.3 新版本特性介绍

    StarRocks

    面试?进大厂?还得靠这份Java面试指导手册

    王小凡

    Java 面试 JVM Java多线程 秋招

    数字孪生万物可视 |联接现实世界与数字空间

    华为云开发者联盟

    云计算 大数据 后端 智慧城市 数字孪生

    即时通讯-改变社交与工作状态的新型软件

    WorkPlus

    上海移动基于亚信科技AntDB完成核心账务数据库的国产化替换

    亚信AntDB数据库

    AntDB 国产数据库 aisware antdb

    专访亚信科技张桦:AntDB面向企业核心业务支撑的数据库产品

    亚信AntDB数据库

    AntDB 国产数据库 aisware antdb

    【堡垒机小知识】硬件堡垒机是什么意思?其与云堡垒机有什么区别?

    行云管家

    云计算 网络安全 数据安全 堡垒机 云堡垒机

    兆骑科创赛事活动承办,项目路演,人才引进平台

    兆骑科创凤阁

    【7.22-7.29】写作社区精彩技术博文回顾

    InfoQ写作社区官方

    优质创作周报

    一文读懂Elephant Swap,为何为ePLATO带来如此高的溢价?

    西柚子

    兆骑科创海外高层次人才引进平台,企业项目对接,赛事活动路演

    兆骑科创凤阁

    关于数字化转型 你需要知道的八项指导原则

    WorkPlus

    APP为什么用JSON协议与服务端交互:序列化相关知识

    程序员啊叶

    Java 编程 程序员 架构 java面试

    突破性能天花板!亚信数据库支撑 10 多亿用户,峰值每秒百万交易

    亚信AntDB数据库

    AntDB 国产数据库 aisware antdb

    今天拿SpringAOP和自定义注解的通用性开🔪

    知识浅谈

    切面编程 7月月更

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