gpt4 book ai didi

Docker 镜像和操作系统安全更新

转载 作者:行者123 更新时间:2023-12-02 04:01:23 25 4
gpt4 key购买 nike

假设我正在使用 Node.js 10.8.0 node:10.8.0-jessie Docker image作为我的应用程序 Dockerfile 的基础镜像。该应用程序在生产中运行稳定,并且有一段时间(几个月)没有更新。

Node.js 10.8.0 镜像基于 buildpack-deps:jessie image ,它本身基于 buildpack-deps:jessie-scm image 。这是基于 buildpack-deps:jessie-curl image ,其基数 imagedebian:jessie

定期发布 Debian Jessie 的系统/安全更新。在经典的托管环境中,我会使用 sudo apt-get update && sudo apt-get update 更新我的主机,我很好。

但是,如何确保容器中运行的 Node.js 应用程序获得最新的 Debian Jessie 更新和补丁,同时保留在 Node.js node:10.8.0-jessie?

在我的 CI 中为我的应用程序 Dockerfile 运行 sudo apt-get update && sudo apt-get update 并定期为我的应用程序创建一个新镜像并重新部署容器没有以正确的方式提供它们。

由于这一切都是从 debian:jessie 图像开始的,因此我希望它以及所有依赖的图像都能定期更新。

然后,我将通过再次拉取 Node.js 10.8.0 镜像 (--no-cache) 来重建我的应用程序镜像并重新部署它。

我的问题是:这个假设正确吗?有没有关于该工作流程的任何对我来说至关重要的官方 Docker 文档?我如何获得有关 debian:jessie 以及最终 node:10.8.0-jessie 镜像补丁版本的通知?

最佳答案

首选工作流程是提取更新的基础镜像,或者重建基础镜像(如果是本地构建的)。然后重建你的 child 图像。如果可能的话,您运行的唯一命令应该是安装,而不是升级。要修复应用程序的特定版本,请在安装命令中添加该版本依赖项。

由于以下几个原因,这比升级现有镜像中的包更受欢迎:

  • 升级镜像仍会将旧版本的软件包保留在镜像层中,从而导致镜像的大小不必要地增大。
  • 升级需要为每个新版本创建一个新的 Dockerfile,并将父镜像设置为以前的版本,从而造成维护挑战。
  • 复制通过升级过程创建的镜像需要首先安装大量旧版本并再次构建层。
  • 为每次升级添加层会降低联合文件系统的性能。某些存储驱动程序还对可以创建的层数有限制,在升级周期进行足够多的迭代后,这些层最终会失败。
  • 升级会带来状态漂移的风险。如果升级链中的一个镜像包含在 Dockerfile 链中丢失的更改,或者先前安装的状态更改了全新安装的运行方式,您将获得一个无法重现的环境,该环境可能会因未知原因而中断。

我可能执行升级的唯一情况是上游基础镜像未得到维护。最好我会找到一个不同的基础镜像,或者在本地构建它。但是,当这些都不可能时,我可以构建一个本地基础镜像,它是未维护的外部基础镜像的子级,第一步是升级软件包。在 Dockerfile 中,这看起来像:

FROM scratch as remote-unmaintained
ADD unmaintained.tgz /

FROM remote-unmaintained as local-base
RUN upgrade-cmd

FROM local-base as app
COPY app /
CMD /app

关于Docker 镜像和操作系统安全更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51669697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com