【问题标题】:Handling software updates in Docker images处理 Docker 映像中的软件更新
【发布时间】:2016-10-03 21:26:23
【问题描述】:

假设我创建了一个名为 foo 的 docker 映像,其中包含 apt 包 foofoo 是镜像内部长期运行的服务,因此镜像不会经常重启。更新容器内的包的最佳方法是什么?

我可以用它们正在运行的foo 版本标记我的图像,并在容器内安装特定版本的包(即apt-get install foo=0.1.0 并标记我的容器foo:0.1.0)但这意味着跟踪包的版本并在每次包更新时创建一个新的图像/标签。如果有某种方法可以自动化它,我会非常高兴,但我还没有看到这样的东西。

另一种方法是在容器启动时安装(和更新)包,但这意味着容器启动的延迟会有所不同,具体取决于它是来自映像的新容器还是我们正在启动现有容器。我目前正在使用这种方法,但对于较大的包裹,延迟可能会相当烦人。

处理此问题的(客观上)最佳方法是什么?必须等待容器启动并自行更新并不理想。

【问题讨论】:

    标签: docker auto-update apt package-managers


    【解决方案1】:

    如果您需要更新容器中的某些内容,则需要构建一个新容器。将容器视为静态编译的二进制文件,就像使用 C 或 Java 一样。容器内的所有内容都是依赖项。如果必须更新依赖项,则重新编译并发布新版本。

    如果您在启动时篡改容器的内容,您将失去 Docker 的所有好处:您拥有可追溯的构建过程,并且每个容器在任何地方和每次复制时都可验证地逐位相同。

    现在让我们解决为什么您需要更新foo。您必须在正常应用程序交付周期之外更新依赖项的唯一原因是修补安全漏洞。如果你有一个 CVE 通知 ubuntu 刚刚发布了一个安全补丁,那么,是的,你必须基于 ubuntu 重建每个容器。

    有几种服务可以扫描并告诉您容器何时易受已发布 CVE 的攻击。例如,Quay.ioDocker Hub 扫描注册表中的容器。您也可以使用 Quay 在后台使用的 Clair 自己执行此操作。

    对于任何其他类型的更新,请不要这样做。对于您的应用程序及其运行的操作系统,Docker 是 100% 的石化策略。

    因此,即使您将 Docker 容器复制到 1000 个安装了略微不同的库版本的主机,或者将其与安装了不同库版本的其他容器一起运行,您的 Docker 容器也能正常工作。即使无法再从 Internet 下载依赖项,您的容器也将在 2 年后继续工作。

    如果由于某种原因您无法从头开始重建容器(例如,它已经使用了 2 年并且所有依赖项都丢失了)那么是的,您可以下载容器,以交互方式运行它,并更新依赖项。在 shell 中执行此操作,然后将容器的新版本发布回注册表并重新部署。不要在启动时这样做。

    【讨论】:

    • 嗯,更新foo 的原因是,通常最好使用最新版本的服务,尤其是在您的版本过时时提示您的服务。我不知道您应该将容器视为静态实体,但这是有道理的。我将看看使用静态版本和标签自动创建容器,谢谢!
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多