Jac*_*don 1 apt package-managers auto-update docker
假设我创建了一个名为 docker 映像foo,其中包含 apt 包foo。foo是映像内长期运行的服务,因此映像不会经常重新启动。更新容器内的包的最佳方法是什么?
foo我可以用它们正在运行的版本来标记我的图像,并在容器内安装特定版本的包(即apt-get install foo=0.1.0标记我的容器foo:0.1.0),但这意味着跟踪包的版本并创建新的图像/标签每次软件包更新时。如果有某种方法可以实现自动化,我会非常高兴,但我还没有看到这样的事情。
另一种方法是在容器启动时安装(和更新)软件包,但这意味着容器启动时会出现不同的延迟,具体取决于它是来自映像的新容器还是我们正在启动现有容器。我目前正在使用这种方法,但对于较大的包来说,延迟可能会相当烦人。
处理这个问题(客观上)最好的方法是什么?必须等待容器启动并自行更新并不是很理想。
如果您需要更新容器中的某些内容,则需要构建一个新容器。将容器视为静态编译的二进制文件,就像使用 C 或 Java 一样。容器内的所有内容都是依赖项。如果必须更新依赖项,请重新编译并发布新版本。
如果您在启动时篡改容器的内容,您将失去 Docker 的所有优势:您拥有可追踪的构建过程,并且每个容器在任何地方、每次复制时都可以验证逐位相同。
现在我们来谈谈为什么需要更新foo。您必须在正常应用程序交付周期之外更新依赖项的唯一原因是修补安全漏洞。如果您有 CVE 通知 ubuntu 刚刚发布了安全补丁,那么,是的,您必须基于 ubuntu 重建每个容器。
有多种服务可以扫描并告诉您容器何时容易受到已发布的 CVE 的攻击。例如,Quay.io和Docker Hub扫描注册表中的容器。您也可以使用Clair自行完成此操作,Quay 在后台使用了 Clair。
对于任何其他类型的更新,请不要执行此操作。Docker 是针对您的应用程序及其运行的操作系统的 100% 化石化策略。
因此,即使您将 Docker 容器复制到安装了略有不同的库版本的 1000 个主机,或者将其与安装了不同库版本的其他容器一起运行,您的 Docker 容器也将正常工作。即使无法再从互联网下载依赖项,您的容器将在 2 年后继续工作。
如果由于某种原因您无法从头开始重建容器(例如,它已经有 2 年历史并且所有依赖项都丢失了),那么是的,您可以下载容器,以交互方式运行它,并更新依赖项。在 shell 中执行此操作,然后将容器的新版本发布回注册表并重新部署。不要在启动时执行此操作。
| 归档时间: |
|
| 查看次数: |
1202 次 |
| 最近记录: |