无法用Anchore Grype扫描本地未推送镜像的CVE,求解决方案
问题
显然,除非Docker镜像已预先推送至镜像仓库,否则无法使用Anchore Grype对其进行漏洞(CVE)安全扫描。这导致它目前无法用于拦截仓库中的漏洞镜像——因为镜像推送后,扫描完成前,带有严重CVE的受感染镜像可能会被不知情的用户立即拉取(在镜像被撤回前)。
问题复现步骤
- 使用
docker build构建镜像,不推送至镜像仓库。 - 尝试用
grype扫描本地镜像,出现如下错误:
$ ./scan-with-grype-dockerized.sh mirekphd/ml-cache:20230726 [0000] INFO grype version: 0.64.2 1 error occurred: * failed to catalog: unable to load image: unable to use OciRegistry source: failed to get image descriptor from registry: GET https://index.docker.io/v2/mirekphd/ml-cache/manifests/20230726: MANIFEST_UNKNOWN: manifest unknown; unknown tag=20230726
解决方案
1. 直接扫描本地Docker镜像
Grype本身支持扫描本地Docker守护进程中的镜像,无需推送至远程仓库。你遇到的错误是因为扫描脚本默认从远程仓库拉取镜像,而非读取本地镜像。
修改扫描命令,指定扫描本地镜像:
# 方式1:明确指定本地镜像源 grype docker-daemon:mirekphd/ml-cache:20230726 # 方式2:使用docker协议,Grype会优先尝试本地镜像 grype docker://mirekphd/ml-cache:20230726
如果是用容器化的Grype脚本,需要让容器能访问本地Docker守护进程,修改scan-with-grype-dockerized.sh脚本:
#!/bin/bash docker run --rm -v /var/run/docker.sock:/var/run/docker.sock anchore/grype:latest docker-daemon:$1
2. 构建-扫描-推送的CI/CD流水线管控
在镜像发布流程中加入前置扫描环节,从根源阻止漏洞镜像流入仓库:
- 构建镜像后立即执行本地扫描
- 配置扫描阈值:若发现严重(Critical)或高危(High)级别的CVE,直接终止流水线,不推送镜像
- 仅当扫描结果符合安全标准时,才将镜像推送至正式仓库
3. 本地临时仓库中转(可选)
如果业务场景必须依赖仓库方式扫描,可以搭建本地私有临时仓库:
- 构建镜像后先推送到本地临时仓库(如用Docker官方
registry容器搭建) - 使用Grype扫描本地临时仓库中的镜像
- 扫描通过后,再将镜像同步到正式远程仓库
- 本地临时仓库仅用于内部扫描,不对外暴露,避免用户拉取未验证的镜像
内容的提问来源于stack exchange,提问作者mirekphd
相关产品推荐
相关产品推荐

