最快判断第三方镜像安全性的第一步是用docker history命令,重点盯CREATED BY和SIZE两列:CREATED BY显示每层执行的Dockerfile指令(如RUN curl | sh、FROM ubuntu:latest等高危模式),SIZE异常大则提示缓存未清理或敏感文件残留;配合--no-trunc、--filter和grep筛选,再通过docker run、docker save导出或trivy/docker scout工具深入验证具体层内容与漏洞归属。

直接用 docker history 查第三方镜像,是最快判断它安不安全的第一步。重点不是看“有没有层”,而是盯住每层背后的指令和大小——这些信息暴露了构建者干了什么、留下了什么。
盯紧 CREATED BY 和 SIZE 两列
CREATED BY 显示每一层实际执行的命令,这是风险溯源的起点:
- RUN curl -sSL https://.* | sh 或 wget.*.sh | bash:远程下载并执行脚本,极大概率带后门
- FROM ubuntu:latest、debian:stable、alpine:edge:标签模糊,无法锁定具体版本,可能拉取含已知漏洞的旧基础镜像
- RUN pip install -r requirements.txt(未固定版本)或 npm install(无 lock 文件):运行时动态装包,可能引入含 CVE 的恶意/过期依赖
- RUN apt-get update && apt-get install -y vim curl wget netcat:非生产必需工具,明显扩大攻击面
SIZE 异常大也要警惕:
- 某层突然超过 100MB,很可能是
apt-get install后没清理缓存(rm -rf /var/lib/apt/lists/*缺失) - 也可能是偷偷打包了
.git目录、调试日志、临时密钥文件等敏感内容
用 --no-trunc 和过滤快速缩小可疑范围
默认输出会截断指令,看不到完整命令。加 --no-trunc 才能看清真实操作:
-
docker history --no-trunc nginx:1.25—— 看全指令,不被省略误导 -
docker history --filter "size>100000000" myapp:prod—— 快速定位超大层 -
docker history --format "{{.ID}} {{.CreatedBy}}" --no-trunc myapp:prod | grep -i "curl\|wget\|bash\|chmod.*777"—— 扫描高危关键词
进层验证,确认风险是否真实存在
history 只告诉你“哪一层有嫌疑”,要确认有没有真问题,得动手查内容:
- 启动容器运行检查命令:
docker run --rm myapp:prod ls -l /app/secrets/ || echo "no secrets dir" - 查是否误装开发包:
docker run --rm myapp:prod dpkg -l | grep -i "dev\|debug\|vim" - 导出某层快速扫文件:
docker save myapp:prod | tar -xO '*/layer.tar' | tar -t | grep -E "(id_rsa|\.env|vi|nano)"
搭配 Trivy 或 Docker Scout 自动打点归属层
人工翻容易漏,工具能直接把漏洞和配置问题关联到具体 layer ID:
-
trivy image --security-checks vuln,config myapp:prod—— 显示哪个 layer 引入了 CVE,哪个 layer 写了不安全 ENV -
docker scout cves myapp:prod—— 官方工具,报告里明确标出漏洞对应的 Dockerfile 行号和修复建议 -
docker scout config myapp:prod—— 检出高危配置,比如EXPOSE 22、USER root、privileged: true


















