正文
一个棘手的事情是固定操作系统中使用包安装器安装的软件的版本问题,再Debian中,运行apt-get安装特定的版本信息,例如:
RUN apt-get update && \
apt-get install -yq --no-install-recommends \
i2c-tools=3.1.1-1 \
...
Debian软件包,Alpine软件包和Fedora软件包及其各自的软件包管理器也是如此。 如果你已经安装了大量的软件包,这需要花更多的时间设置版本信息,但是从长远来看它是值得的。
通常,您将从版本控制(例如从git / GitHub)安装软件,在这种情况下,没有理由不使用由唯一ID(如git的hash / SHA)定义的特定提交或标签 。 下面是一个如何使用git检出代码的特定标记版本的示例:
# Can use tag or commit hash to set MRAAVERSION
ENV MRAAVERSION v1.3.0
RUN git clone https://github.com/intel-iot-devkit/mraa.git && \
cd mraa && \
git checkout -b build ${MRAAVERSION} && \
...
最终,安装版本都来自于不管任何库申请都是固定的版本,不论使用了requirements.txt(Python管理安装模块),package.json(Node.js管理安装模块),Cargo.toml(Rust管理安装模块),或者是其他语言的管理的安装包管理器,这样就总是固定版本(或者是经常锁定冻结)依赖版本号或者唯一提交。
自我清理
普遍来讲,加快计算机程序最好的方式之一是消除不必要计算(做的更少)。通常来讲,软件部署也是如此,加快部署和更新的最佳方式不发送不需要的代码。所以,自身来讲从容器中清除不必要的代码,可以提高效率。
什么是不需要的代码? 最常见的是,它们是保存在包管理器中的临时文件或者是在Dockerfile中构建和安装的软件源代码。
在包管理器之后清理的方式取决于在您的基本映像中使用的分发方式。 在Debian和Raspbian的情况下使用的是apt-get,Docker已经有很多建议Dockerfile中使用apt-get。 最后,完成安装步骤,删除临时信息,如下:
RUN apt-get update && \
apt-get install -yq --no-install-recommends \
\
&& apt-get clean && rm -rf /var/lib/apt/lists/*
上面的最后一行通过apt-get rm删除了设备上不需要的的临时文件。
如果你使用Alpine Linux,apk包管理工具有一个方便的–no-cache选项:
RUN apk add --no-cache
Fedora系统中,dnf包管理器可以通过apt-get简单处理: