如何保持自己的Docker镜像中的应用程序是最新的?

假设我自己的Docker镜像基于Debian镜像,我使用RUN apt-get来安装Apache。

当基础图像更新时,我需要删除我的容器,并创build一个新的。 这可以自动化,例如用守望台。

但是我怎么能保持容器内的应用程序(在我的例子中的Apache)最新? 基础映像不会因为基本映像附带的一个包中的安全问题得到修复而不会更改。 当我用Dockerfile创build一个新的容器时,由于Docker的图像caching,Apache仍然没有更新。

我该如何处理应用程序更新,就像使用包pipe理器在主机上安装Apache一样简单?

您可以使用像SaltStack,Chef,Ansible或Puppet这样的系统进行适当的configurationpipe理。 它们使您能够精确pipe理软件版本,安装,更新以及pipe理实际configuration文件。

程序是:

  • build立新的图像。 对于更改的步骤,可以将未使用的构build参数作为每个构build更改的variables进行传递,并强制caching失效。 或者,您可以使用--pull --no-cache选项重build整个图像,同时更新基础图像。
  • 如果您在多个节点上运行此映像(或在与构build服务器不同的计算机上运行它),请将这些映像保存在registry中。
  • 更新正在运行的容器。 通过撰写,您可以运行docker-compose pull && docker-compose up -d 。 使用swarm,您可以运行docker stack deploy -c compose.yml --with-registry-auth ,它将从版本17.06开始从registry中提取最新版本。 如果您手动调用docker run ,那么您需要首先调用相应的docker pull (从registry中提取图像),然后删除/重新创build容器。

为了使所有这些自动化,像Jenkins,GoCD,Drone.io等CI-CD工具将被用于执行所有这些步骤。

使用'–no-cache –pull'来运行你的'docker build',以确保它总是使用新的基本映像,并且不会尝试重新使用caching层进行软件包更新。

你可以在你的Dockerfile的中间设置一个“cache buster”注释(例如,在你执行apt-get的行),以确保它始终运行。 例如:

Dockerfile:

 ARG CACHEBUST=1 RUN apt-get update && apt-get upgrade # $CACHEBUST 

在构build时,将buildarg设置为例如当前PID或$ RANDOM,以始终从该行构build重build:

 docker --build-arg CACHEBUST=$$ 

或每天重build一次

 docker --build-arg CACHEBUST=`date +%Y%m%d`