TL;DR:无论你的基础镜像看起来多么权威:
- 始终确保镜像已正确配置并启用了上游安全更新源。
- 在最终业务镜像中,始终加入
RUN apt-get update && apt-get upgrade -y(或等价命令)。 - 始终按周或按月安排你自己的重建任务。
背景 #
- Docker 官方镜像(DOI)的唯一事实来源是 https://github.com/docker-library/official-images 的 master 分支。他们使用一种名为 “Library definition files” 的格式,定义了哪些仓库里的哪些标签应被主动重建,以及对应 Dockerfile 的位置(git 仓库 URL 和 commit ID)。这些
repo:tag被称为当前维护的镜像。- 这些被引用的 Dockerfile 仓库中,大多数但并非全部由 Docker 公司自身 维护。可见一个示例。
- https://doi-janky.infosiftr.net/ 上的 Jenkins 任务会分析所有 DOI 的 Dockerfile,生成 DOI 之间的最新依赖关系,并写入 https://github.com/docker-library/meta。
- 基于这些元数据,每次 DOI Dockerfile 的 PR 被合并,都会在 https://doi-janky.infosiftr.net/ 触发其所有下游 DOI(即
FROM它的镜像)重建并推送到 Docker Hub。- 不保证有定期、无条件重建。
观察 #
- Docker 公司的 DOI 在 Dockerfile 中不会执行
RUN apt upgrade(或等价命令),其他 DOI 供应方也未被要求这样做。 - 即使某个 DOI 供应方在 Dockerfile 里有系统升级步骤,如果没有定期、无条件重建,安全补丁(如果有)也不会被安装。
- 某些 DOI 使用的发行版默认禁用了安全更新源。示例可参考:
docker run --rm mysql:9.6.0 tail /etc/yum.repos.d/oracle-linux-ol9.repo。
因此,当前维护中的 DOI 并不能保证在构建时是无 CVE 的。也因此,一次“空操作式重建”(不包含 RUN apt upgrade 或等价命令)并不能修复任何问题。
参考资料: