让我们考虑我正在使用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,其基础image为debian: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
图像补丁发布的通知?
答案 0 :(得分:1)
首选工作流程是提取更新的基础映像,或者重建基础映像(如果它是本地构建的)。然后重建您的子图像。如果可能的话,您运行的唯一命令应该是安装而不是升级。要修复特定版本的应用程序,请在安装命令中添加该版本依赖性。
出于以下几个原因,这比升级现有映像中的软件包更可取:
我可能执行升级的唯一方案是,如果不维护上游基本映像。最好是我找到一个不同的基本映像,或在本地构建它。但是,当两者都不可行时,我可以通过升级软件包的第一步,构建一个本地基础映像,该本地基础映像是未维护的外部基础映像的子级。在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发行版。
如果您还不清楚,但您对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
,然后将此映像用作应用程序映像的基础映像。但是这种方式会在最终图像中添加图层,然后会增加其大小。