MAINTAINER 已被弃用,应改用标准化 LABEL 实现供应链追溯;需在 OCI 标签中固化 source、revision、created、version、authors 字段,CI 动态注入,多阶段构建中显式重写,再与扫描工具协同闭环验证。

MAINTAINER 指令在较新版本 Docker(17.06+)中已被弃用,官方明确推荐改用 LABEL maintainer=...。它本身不提供供应链追溯能力,只是历史遗留写法;真正支撑全程安全追溯的是结构化、标准化的 LABEL 元数据体系。核心不是“怎么写 maintainer”,而是“怎么用 LABEL 打好可验证的元数据身份证”。
下面从四个关键环节讲清楚怎么做:
一、用标准 OCI 标签固化构建源头信息
必须写全以下字段,才能满足 ISO 27001、等保2.0、SOC2 等审计要求:
-
org.opencontainers.image.source:HTTPS 形式 Git 地址(如https://github.com/org/app),不能是git@ -
org.opencontainers.image.revision:40 位完整 commit SHA(非短哈希),确保代码与镜像精确绑定 -
org.opencontainers.image.created:RFC 3339 时间戳(如2026-05-26T08:30:00Z),由 CI 注入,禁用date命令硬编码 -
org.opencontainers.image.version:语义化版本(如v2.1.0),需与 Git tag 严格一致,禁止用latest -
org.opencontainers.image.authors:团队级联系渠道(如dev-team@company.com或#security-oncallSlack 频道),不写个人姓名
这些字段不是可选装饰,缺失任意一项,Trivy、Syft 等合规扫描工具会直接标记为 metadata incomplete。
二、在 CI 构建命令中动态注入真实值
不要在 Dockerfile 里写死,而应在 docker build 时用 --build-arg 和 LABEL 组合注入:
# Dockerfile 片段(集中定义,避免分散)
ARG GIT_COMMIT
ARG BUILD_NUMBER
ARG BUILD_TIME
LABEL org.opencontainers.image.revision=$GIT_COMMIT \
org.opencontainers.image.created=$BUILD_TIME \
org.opencontainers.image.build.number=$BUILD_NUMBER \
org.opencontainers.image.version=$VERSIONCI 脚本中调用:
docker build \ --build-arg GIT_COMMIT=$(git rev-parse HEAD) \ --build-arg BUILD_NUMBER=$CI_PIPELINE_ID \ --build-arg BUILD_TIME=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \ --build-arg VERSION=v2.1.0 \ -t myapp:v2.1.0 .
这样每个镜像都自带唯一、不可篡改的构建指纹。
三、多阶段构建中确保 LABEL 不丢失
常见错误:只在 builder 阶段写 LABEL,final 阶段用 FROM scratch 或 alpine 后没重写。正确做法是:
- final 阶段必须显式声明全部关键 LABEL
- 若使用
COPY --from=builder,LABEL 不会自动继承,必须手动补全 -
FROM scratch镜像无基础层,LABEL 必须在该阶段第一条指令就写入
示例:
FROM golang:1.22 AS builder
# ... 编译逻辑
FROM scratch
COPY --from=builder /app/myapp /myapp
# ⚠️ 这里必须重新写 LABEL,否则全空
LABEL org.opencontainers.image.source="https://github.com/org/app" \
org.opencontainers.image.revision="a1b2c3d4..." \
org.opencontainers.image.version="v2.1.0"四、打通仓库与扫描工具,实现状态闭环
LABEL 是静态元数据,不能存扫描结果(如 scan_status=passed),因为漏洞扫描发生在构建之后。正确闭环方式是:
- 构建时写入
org.opencontainers.image.digest(可选,由 CI 计算并注入) - 推送镜像后,由 Trivy/Snyk 扫描,将结果写入 Harbor 的 artifact annotation 或独立数据库
- 部署前通过策略引擎(如 OPA/Gatekeeper)校验:
- 镜像 digest 是否匹配已扫描记录
- 扫描时间是否在 72 小时内
- 是否存在 critical 漏洞且未豁免
此时,LABEL 提供的是「我是谁、从哪来、何时建」,扫描系统提供「我现在安不安全」,两者结合才构成完整追溯链。
不复杂但容易忽略


















