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

时间:2018-08-03 09:39:01

标签: docker

让我们考虑我正在使用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 upgrade更新主机,我很好。

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

在我的CI中为我的应用程序sudo apt-get update && sudo apt-get upgrade运行Dockerfile并定期为我的应用程序创建新映像并重新部署容器不是正确的方法。

因为它们都是以debian:jessie图片开头的,所以我希望它会定期更新,并且所有相关图片也会随之更新。

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

我的问题是:这个假设正确吗?是否有任何关于该工作流程的正式Docker文档对我来说很重要? 如何获得有关debian:jessie以及最终node:10.8.0-jessie图像补丁发布的通知?

2 个答案:

答案 0 :(得分:1)

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

出于以下几个原因,这比升级现有映像中的软件包更可取:

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

我可能执行升级的唯一方案是,如果不维护上游基本映像。最好是我找到一个不同的基本映像,或在本地构建它。但是,当两者都不可行时,我可以通过升级软件包的第一步,构建一个本地基础映像,该本地基础映像是未维护的外部基础映像的子级。在Dockerfiles中,它看起来像:

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

答案 1 :(得分:-1)

当我今天想使用Docker映像时,我总是尝试查找此映像的alpine版本。这是有原因的:

  

Alpine Linux是基于musl libc和busybox的面向安全的轻量级Linux发行版。

     

https://alpinelinux.org/

如果您还不清楚,但您对Alpine Linux感兴趣,建议您浏览他们的网站。

好的一点是,良好的社区可以很好地处理这种分布。这表示发行版经常更新以集成新的安全修复程序。

重要的是要理解这确实是令人困惑的(讲Docker),因为正如您在问题中所说的那样,构建的图像在整个时间都是不可变的。

通过在Docker中使用基于Alpine的映像,您可以确保从已知的实际错误/安全威胁中获得最新的修复程序。要知道他们多久更新一次Docker映像,您可以查看以下页面:https://hub.docker.com/r/library/alpine/tags/

基于该图片的每张图片都会同时更新,并且有很多图片:

我认为我的解决方案不是最好的,但仍然可以帮助您

在服务器上,我创建了一个CRON任务,每天提取我正在使用的Alpine映像,例如node:8-alpine

此后,每当我基于该映像构建应用程序时,我都可以确定我具有最新更新。

如果您想更深入一点,甚至可以在拉出node:8-alpine图片之后构建自己的应用。

关于您不希望进行新的更新/升级的问题,我不知道如何,但是我想使用Alpine图像,您可以订阅其RSS:https://alpinelinux.org/atom.xml

使用Alpine图片的其他原因很多,但由于它不在主题范围内,因此我仅向您提供这篇文章:https://nickjanetakis.com/blog/the-3-biggest-wins-when-using-alpine-as-a-base-docker-image

编辑1:

由于您具有CI环境并使用其构建映像,因此可以定期创建自己的Dockerfile,在其中执行apt-get update && apt-get install,然后将此映像用作应用程序映像的基础映像。但是这种方式会在最终图像中添加图层,然后会增加其大小。