必须用org.opencontainers.image.authors,因maintainer已被Docker官方弃用,OCI兼容工具(如Trivy、Syft)可能忽略它,导致安全审计失败。

维护者信息该用哪个键名:org.opencontainers.image.authors 还是 maintainer?
必须用 org.opencontainers.image.authors,maintainer 已被 Docker 官方弃用,虽然还能解析,但不保证长期兼容,且在 OCI 兼容工具(如 Trivy、Syft、Kubernetes 镜像策略控制器)中可能被忽略。
常见错误现象是:docker inspect 能看到 maintainer,但 CI 流水线里的安全扫描器查不到联系人,导致审计失败。
正确写法示例:
LABEL org.opencontainers.image.authors="dev-team@company.com" \
org.opencontainers.image.vendor="Company Inc." \
org.opencontainers.image.url="https://docs.company.com/security"
- 值中含空格或特殊字符必须用双引号包裹
- 多个邮箱用英文逗号分隔,如
"alice@company.com,bob@company.com" - 不要写成
org.opencontainers.image.author(少了个 s),拼错就查不到
安全审核状态怎么标:用自定义键还是标准键?
OCI 标准里没有预定义“安全审核状态”字段,必须用带命名空间的自定义键,例如 com.company.security.audit-status 或 org.opencontainers.image.security.audit。前者更推荐——避免和未来 OCI 扩展冲突,也方便内部策略引擎识别。
典型使用场景是:CI 在完成 SCA(软件成分分析)和 SAST 扫描后,动态注入结果。
构建时注入示例:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
docker build \ --label "com.company.security.audit-status=passed" \ --label "com.company.security.audit-date=2026-05-02T10:30:00Z" \ --label "com.company.security.scanner=trivy-0.45.0" \ -t myapp:prod .
- 同一键名下,
--label优先级高于 Dockerfile 中的LABEL,适合 CI 替换临时状态 - 值建议限定为
pending/passed/failed/skipped,避免自然语言(如 “已通过人工复核”),不利于脚本判断 - 时间戳必须用 ISO 8601 格式(含
T和Z或时区偏移),否则date -d解析失败
怎么验证 Labels 是否真被写进镜像且可被工具读取?
别只信 docker inspect | grep authors ——那只是粗略搜索,容易漏匹配或误匹配。要用精确路径提取:
docker inspect --format='{{index .Config.Labels "org.opencontainers.image.authors"}}' myapp:prod
输出应为 "dev-team@company.com"(带引号),空字符串或 <no value> 表示未生效。
检查安全状态字段是否可用:
docker inspect --format='{{index .Config.Labels "com.company.security.audit-status"}}' myapp:prod
- 如果返回空,常见原因有:Dockerfile 没重新构建(缓存命中跳过 LABEL)、键名大小写不一致(
Audit-Status≠audit-status)、构建命令漏传--label - CI 中建议加一行校验脚本:
[[ "$(docker inspect ...)" == '"passed"' ]] || exit 1 - 注意:
docker inspect输出的.Config.Labels是 map 类型,键名完全匹配,无通配或模糊逻辑
哪些坑最容易导致安全审计不认你的 Labels?
最隐蔽的问题不是写错,而是“写对了但没生效”:
- 多阶段构建中,
LABEL只写在最终FROM阶段才有效;若写在 builder 阶段,构建完就丢弃了 - 使用
FROM scratch基础镜像时,LABEL必须放在COPY或ADD之后,否则某些旧版 Docker 会静默忽略 - 镜像推送到私有 registry 后,部分老旧 registry(如 v1 或未开启 OCI 支持的 Harbor)会 strip 掉非标准 label,需确认 registry 日志中是否有
dropping unknown label类警告 - CI 中用
ARG注入值时,忘记在LABEL前加ARG声明,导致变量为空 —— 例如ARG AUDIT_STATUS必须出现在LABEL com.company...=${AUDIT_STATUS}之前
真正卡住上线的,往往不是字段没填,而是字段存在但路径不对、格式非法、或被中间组件过滤掉了。

















