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

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

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

当基础镜像更新时,我需要删除我的容器并创建一个新的。这可以自动完成,例如使用 Watchtower。

但是我如何才能使容器内的应用程序(在我的示例中为 Apache)保持最新状态?基础映像不会因为未随基础映像一起提供的某个软件包中的安全问题得到修复而改变。当我使用 Dockerfile 创建新容器时,由于 Docker 的映像缓存,Apache 仍然不会更新。

如果我使用包管理器在主机上安装 Apache,我该如何轻松地处理应用程序更新?

答案1

程序如下:

  • 构建新镜像。对于发生变化的步骤,您可以将未使用的构建参数作为变量传递,该变量会随着每次构建而变化,并强制缓存失效。或者,您可以使用选项重建整个镜像,--pull --no-cache这也会更新基础镜像。
  • 如果您在多个节点上运行此程序(或在与构建服务器不同的机器上运行它),请将图像保存在您的注册表中。
  • 更新正在运行的容器。使用 compose,您可以运行docker-compose pull && docker-compose up -d。使用 swarm,您可以运行docker stack deploy -c compose.yml --with-registry-auth,它将从注册表中提取截至版本 17.06 的最新版本。如果您手动调用docker run,则需要docker pull先调用相应的(从注册表中提取图像),然后删除/重新创建您的容器。

为了实现所有这些操作的自动化,将使用 Jenkins、GoCD、Drone.io 等 CI-CD 工具来执行所有这些步骤。

答案2

您可以使用 SaltStack、Chef、Ansible 或 Puppet 等系统进行适当的配置管理。它们允许您精确管理软件版本、安装、更新并管理实际配置文件。

答案3

使用“--no-cache --pull”运行“docker build”以确保它始终使用全新的基础映像,并且不会尝试重用缓存层进行包更新。

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

Dockerfile:

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

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

docker --build-arg CACHEBUST=$$

或者每天重建一次

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

相关内容