pjordanandrsn/stale-image-rebuilder

GitHub: pjordanandrsn/stale-image-rebuilder

针对上游容器镜像基础层 CVE 修复滞后的问题,通过拉取源码并刷新基础层重新构建本地镜像,填补 Watchtower 等工具无法主动重建的空白。

Stars: 0 | Forks: 0

# stale-image-rebuilder 在全新的操作系统基础上从源代码重新构建上游容器镜像。适用于维护者仅在打标签发布时才更新,而 `:latest` / `:master` / `:stable` 标签在 debian/alpine/python OS-package CVEs 修复方面严重滞后的情况。 ## 问题所在 你正在运行 `someone/foo:latest`。它是 6 个月前构建的。Trivy 扫描报告指出,其 OS 包中有 50 个可修复的高危/严重 (HIGH/CRITICAL) CVEs —— 全都存在于 `python:3.13-alpine` 基础层中。解决方法是“在当前的 alpine 上重新构建”。然而,维护者既没有设置定时重建的 GitHub Action,而且几个月内也不会发布新版本标签。 此脚本会下载他们的源码,运行 `docker build --pull` 以刷新基础层,重新打标签至 `local/foo:rebuilt` 命名空间,并使用 compose 重新创建容器。同样的 Dockerfile,同样的源代码——只是基础更新了。 ## 使用方法 ``` rebuild.sh [--build-arg KEY=VAL ...] ``` ### 示例:重新构建 AlexxIT/go2rtc ``` rebuild.sh \ https://github.com/AlexxIT/go2rtc/archive/refs/heads/master.tar.gz \ docker/Dockerfile \ local/go2rtc:rebuilt \ /opt/eufy-bridge \ go2rtc ``` ### 示例:使用 build-arg 重新构建 python-matter-server ``` rebuild.sh \ https://github.com/home-assistant-libs/python-matter-server/archive/refs/heads/main.tar.gz \ Dockerfile \ local/matter-server:rebuilt \ /opt/matter-server \ matter-server \ --build-arg PYTHON_MATTER_SERVER=8.1.2 ``` ### 需要修改的 Compose 配置(针对每个服务) 首次重新构建后,请修改你的 `docker-compose.yml` 以使用本地标签: ``` services: foo: image: local/foo:rebuilt # was: someone/foo:latest ``` 这使得后续的重新构建操作具有幂等性 —— `compose up -d` 仅在镜像哈希值实际发生改变时才会重新创建容器。 ## Cron 模式 错开多项重新构建任务,以避免资源占用出现峰值: ``` 0 2 * * 0 /usr/local/bin/rebuild.sh https://github.com/.../master.tar.gz Dockerfile local/foo:rebuilt /opt/foo foo 15 2 * * 0 /usr/local/bin/rebuild.sh https://github.com/.../master.tar.gz docker/Dockerfile local/bar:rebuilt /opt/bar bar ``` ## 配置(环境变量) | 变量 | 默认值 | 用途 | |---|---|---| | `REBUILDER_LOG_DIR` | `/var/log` | 各服务的日志将写入 `/rebuild-.log` | | `REBUILDER_WORKDIR` | `/var/lib/stale-image-rebuilder` | Tarball 包及解压后的源码(各服务对应独立子目录) | | `DOCKER` | `docker` | 如果你使用的 docker 二进制文件不在 PATH 中(例如 QNAP Container Station),可在此覆盖 | | `REBUILDER_RELAY_HOST` | (未设置) | 如果与 `REBUILDER_EMAIL` 一同设置,失败时会通过 SSH 连接到此主机以发送邮件 | | `REBUILDER_EMAIL` | (未设置) | 失败告警的收件人 | 如果 `REBUILDER_RELAY_HOST` 和 `REBUILDER_EMAIL` 都未设置,则仅记录失败日志。 ## 为什么不使用 Watchtower / Renovate? - **Watchtower** 只能拉取新标签。它无法进行重新构建——如果维护者没有发布新标签,Watchtower 将无能为力。 - **Renovate** 用于更新源文件中的依赖版本。它不能重新构建容器。 本脚本专门用于填补这一空白:当你需要更新的镜像,而上游又未采取任何行动时。 ## 限制 - 仅适用于指定了明确版本的 `FROM` 指令(如 `python:3.13`、`alpine:3.20` 等)的 Dockerfile。如果 Dockerfile 绑定了特定的摘要值(如 `alpine@sha256:...`),`--pull` 将不起作用——你需要先更新该摘要值。 - 不会跟踪上游的提交——总是拉取分支上的最新代码。如果你需要可复现性,请使用 git submodules 或锁定特定的 commit。 - Compose 服务必须符合 `compose up -d ` 的形式(即你的容器名称 = 服务名称)。 ## 许可证 MIT
标签:Alpine Linux, Cron, CVE修复, Debian, DevSecOps, Docker, Docker Compose, Home Assistant, PB级数据处理, Python, Shell脚本, Web截图, 上游代理, 基础镜像, 子域名枚举, 安全运维, 安全防御评估, 定时任务, 容器安全, 应用安全, 开源框架, 持续集成, 数字取证, 数据集, 无后门, 漏洞修复, 版权保护, 系统安全, 网络安全培训, 自动化脚本, 请求拦截, 镜像更新, 镜像构建, 镜像重建