1. 选择Debian
官方镜像的大多数Dockerfile,不管是直接还是通过其他镜像,都是基于Debian的。Dockerfile版本通常跟特定的发行版挂钩,正常是使用稳定版(wheezy),有些是测试版(jessie),还有是不稳定版(sid)。Debian镜像的主要好处是文件小,加起来才85.1MB,而Ubuntu要200MB。指定准确的发行版可以预防一些问题,比如,即使标上latest的发行版升级了,构建也不会崩溃。
2. 确定来源
如果要用户信赖你的镜像,你就要考虑如果验证此镜像上的所有软件的真实性。如果通过apt-get方式从Debian的仓库获取,这个验证过程已经被解决了。如果从网上下载文件,或者从第三方仓库安装软件,你就应该通过校验和、数字签名等方式验证这些文件。比如,为了验证nginx包,nginx的Dockerfile会做如下操作:
RUN apt-key adv --keyserver pgp.mit.edu --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
RUN echo "deb http://nginx.org/packages/mainline/debian/ wheezy nginx" >> /etc/apt/sources.list
ENV NGINX_VERSION 1.7.7-1~wheezy
RUN apt-get update && apt-get install -y nginx=${NGINX_VERSION}
注意nginx也是跟一个特定的版本关联的。这种做法可以保证,维护者测试的镜像跟构建工具构建的是相同的。但是,这个假设也不是绝对的,因为nginx本身的依赖也会随时间变化(比如有些依赖会标明>=某个版本)。
你自己也可以对下载的文件做相似的操作,计算文件校验和,然后跟本地版本(stored version)比较。这些操作都由Redis Dockerfile做过了。另外,有些下载的文件可能包含签名文件,你可以通过gpg来验证,通常这些操作都由官方镜像做过了。
不幸的是,一些官方镜像也没能定期正确地进行这些验证操作,或者只验证了部分文件,所以查看官方Dockerfile时要注意下。
3. 移除构建依赖
如果通过源码编译构建,你的镜像通常比需要的大很多。可能的话,在同一条RUN指令中,安装构建工具、构建软件,然后移除构建工具。虽然这样做又诡异又恼人,但是可以省下几百MB空间。在不同的指令中删除文件是没有意义的,因为这些文件已经被打包进镜像了。我们看下Redis Dockerfile是怎么做的:
RUN buildDeps='gcc libc6-dev make'; \
set -x \
&& apt-get update && apt-get install -y $buildDeps --no-install-recommends \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir -p /usr/src/redis \
&& curl -sSL "$REDIS_DOWNLOAD_URL" -o redis.tar.gz \
&& echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& rm redis.tar.gz \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& ln -s redis-server "$(dirname "$(which redis-server)")/redis-sentinel" \
http://cda.pinggu.org/
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
gcc, libc和make在同一条指令中先被安装,使用,然后被删掉。另外注意下,作者还删除了不会被使用的tar.gz源文件夹。顺带提下,这些代码也演示了如何使用sha1sum来验证Redis下载文件的校验和。
4. 选择gosu
gosu实用工具,通常用在ENTRYPOINT指令调用的脚本中,这些ENTRYPOINT指令位于官方镜像的Dockerfile中。它是个类sudo的简单工具,接受并运行特定用户的特定指令。但是gosu可以避免sudo怪异恼人的TTY和信号转发(signal-forwarding)行为。
看下这篇编写入口点脚本的官方建议https://docs.docker.com/articles/dockerfile_best-practices/,大多数官方镜像都遵循该建议。
5. 选择buildpack-deps基础镜像
很多Docker的"language-stack"镜像都是基于 buildpack-deps 基 础镜像,该镜像包含了通常开发所必须的头文件和工具(比如源码管理工具)。如果你想构建一个language-stack镜像,使用这个基础镜像可以省下 不少时间。但是向镜像添加非必须的东西也遭受了很多批评,这导致了一些仓库,如Node提供了直接基于Debian的可选slim包(完整的Node镜像 有728MB,slim只有291.4MB)。但是记住用户可能需要某些开发库,同时也通过某种途径下载了基础镜像。
6. 使用描述性标签
所有的官方镜像都提供了很多标签。像latest标签一样,提供一个版本标签是种好做法,这样用户就不用担心基础镜像变更而破坏容器。官方镜像做了更多, 提供了上文提及的精简slim镜像,以及自动导入和编译的onbuild镜像。镜像打上onbuild标签,即使转移代码再编译,来新建子镜像,用户也不会太意外。
数据分析咨询请扫描二维码
CDA数据分析师在中国航信高科技产业园进行了面向测试度量的数据分析培训课程,培训人数近2 ...
2024-05-01CDA数据分析师走进深圳迈瑞生物医疗电子股份有限公司,在迈瑞总部展开了为期两天的培训,本次课程参训人员线上及线下近百人, ...
2024-05-01CDA数据分析师在合肥市对合肥阳光新能源科技有限公司开展了为期8天的企业内训。 合肥阳光新能源科技 ...
2024-05-01CDA数据分析师走进海尔大学,进行了《数据治理与数据中台建设的道与术》专题培训,培训现场爆满,近百人参加了此次培训。 ...
2024-05-01在中国银行苏州分行培训中心开始数据分析师培训,此次培训课程共10天内容,包括Excel、MySQL、概率论与数理统计、SPSS等内容, ...
2024-05-01从实际的业务需求出发,结合行业的典型应用特点,围绕实际的商业问题,探讨数据挖掘、机器学习模型在金融领域的应用,包括获客、信用评分、细分画像、交叉销售、反欺诈、违规识别、时序预测、运筹优化、流程挖掘九个方面,形成 ...
2024-05-01本次培训课程为线上+线下的模式,由于学员编程能力不一、部分学员没有编程基础,故提供统计学、python基 ...
2024-05-01华夏银行信用卡中心-机器学习培训 1、课程亮点 取材于业界一流企业和顶级咨询公司的行业实践;已经被证明是人人 ...
2024-05-01主 题:数据中台建设及数据分析应用主题分享 1. 数据中台市场洞察 2. 主流数据中台产品比较 3. 某企业数据中 ...
2024-05-01围绕“数据驱动”战略,全力打造我行 300 人数字化人才梯队,着力培养数字化管理人才、大数据专业团队 ...
2024-05-01在当今数据驱动的商业环境中,数据分析成为了企业决策的重要依据。通过对大量数据的收集、处理和分析,企业能够更好地理解市场 ...
2024-04-29在人工智能(AI)的世界里,提示词(Prompt)是一种强大的工具,它能够引导AI按照用户的需求产生特定的输出。本文将深入探讨AI ...
2024-04-29CDA立足未来职场,拓展前沿视野——对外经贸大学保险学院举办“三全育人大讲堂”分享行业最新动态。 ...
2024-04-294月2日,CDA数据分析师创始发起人兼协会理事长赵坚毅博士受邀在浙江万里学院举办了一场以“数字化能力在职场中的作用” ...
2024-04-29随机森林(Random Forests)现在机器学习中比较火的一个算法,是一种基于Bagging的集成学习方法,能够很好地处理分类和回归的问 ...
2022-12-23方差分析是数据分析中常用的一种统计分析方法,接下来让我们简单了解一下方差分析的基本思想和原理吧。 方差分析(Analysis ...
2022-12-23来源:关于数据分析与可视化 关于streamlit-aggrid 数据排序 表格样式的调整 数据 ...
2022-08-03作者:麦叔 定义 「把上面晦涩的概念汇成一句话就是:」 ❝ 回调函数就是一个被作为参 ...
2022-08-03现今,高学历人群日益增多,物以稀为贵的高学历光环淡去。无论本科生还是研究生,甚至博士生,求职竞争力都大不如前,就业压力越来越大。
2022-06-01某家企业10个人面试,有9个本科生……如何脱颖而出,除得体的举止和良好的沟通力外,证书成重要筹码,这也是很多人考证的关键所在。
2022-04-14