关于 Docker 镜像 CVE 修复与预防

最后更新: 2026-05-04 20:35:38 +0800 CST
原文以英文撰写。您正在阅读AI翻译版本。

TL;DR:无论你的基础镜像看起来多么权威:

  1. 始终确保镜像已正确配置并启用了上游安全更新源。
  2. 在最终业务镜像中,始终加入 RUN apt-get update && apt-get upgrade -y(或等价命令)。
  3. 始终按周或按月安排你自己的重建任务。

背景 #

  1. Docker 官方镜像(DOI)的唯一事实来源是 https://github.com/docker-library/official-images 的 master 分支。他们使用一种名为 “Library definition files” 的格式,定义了哪些仓库里的哪些标签应被主动重建,以及对应 Dockerfile 的位置(git 仓库 URL 和 commit ID)。这些 repo:tag 被称为当前维护的镜像。
  2. https://doi-janky.infosiftr.net/ 上的 Jenkins 任务会分析所有 DOI 的 Dockerfile,生成 DOI 之间的最新依赖关系,并写入 https://github.com/docker-library/meta
  3. 基于这些元数据,每次 DOI Dockerfile 的 PR 被合并,都会在 https://doi-janky.infosiftr.net/ 触发其所有下游 DOI(即 FROM 它的镜像)重建并推送到 Docker Hub。
    • 不保证有定期、无条件重建。

观察 #

  1. Docker 公司的 DOI 在 Dockerfile 中不会执行 RUN apt upgrade(或等价命令),其他 DOI 供应方也未被要求这样做。
  2. 即使某个 DOI 供应方在 Dockerfile 里有系统升级步骤,如果没有定期、无条件重建,安全补丁(如果有)也不会被安装。
  3. 某些 DOI 使用的发行版默认禁用了安全更新源。示例可参考:docker run --rm mysql:9.6.0 tail /etc/yum.repos.d/oracle-linux-ol9.repo

因此,当前维护中的 DOI 并不能保证在构建时是无 CVE 的。也因此,一次“空操作式重建”(不包含 RUN apt upgrade 或等价命令)并不能修复任何问题。

参考资料: