如何在本地或GitHub Actions中用Dependabot CLI等工具扫描Docker镜像URL并获无漏洞标签建议
扫描Docker镜像并获取无漏洞标签建议的方法
一、本地环境实现方案
1. 正确使用Dependabot CLI扫描
如果你之前用Dependabot没达到预期,大概率是配置没到位,试试以下步骤:
- 先装Dependabot CLI:用Homebrew的话跑
brew install dependabot/dependabot/dependabot-core,或者RubyGems安装gem install dependabot-core - 本地创建Dependabot配置文件
.github/dependabot.yml,示例配置如下:
version: 2 updates: - package-ecosystem: "docker" directory: "/" schedule: interval: "daily" vulnerabilities: severity: "critical,high" # 只过滤严重/高危漏洞的镜像标签 allow: - dependency-type: "all"
- 运行扫描命令:
dependabot update docker --directory / --config-file .github/dependabot.yml - 注意:私有镜像要提前配置环境变量,比如
export DEPENDABOT_DOCKER_REGISTRY_PASSWORD=你的密码,确保Dependabot能访问仓库。
2. Skopeo + Trivy 组合扫描
Skopeo用来拉全量标签,Trivy做漏洞扫描,两者结合筛选无漏洞标签:
- 先装工具:Skopeo用
apt install skopeo(Debian/Ubuntu),Trivy跑brew install aquasecurity/trivy/trivy或者官网脚本安装 - 用Skopeo拉取镜像所有标签:
skopeo list-tags docker://nginx(替换成你的镜像地址) - 写个脚本遍历标签,用Trivy扫描并过滤:
IMAGE="nginx" # 遍历所有标签,扫描后输出无严重/高危漏洞的标签 skopeo list-tags docker://$IMAGE | jq -r '.Tags[]' | while read TAG; do VULN_COUNT=$(trivy image --severity CRITICAL,HIGH --format json $IMAGE:$TAG | jq '.Results[].Vulnerabilities | length') if [ "$VULN_COUNT" -eq 0 ]; then echo "无严重/高危漏洞的标签: $TAG" fi done
- 私有镜像要先登录Skopeo:
skopeo login registry.example.com,输入账号密码即可。
二、GitHub Actions中实现方案
1. 用Dependabot官方Action自动扫描
直接配置Workflow,让Dependabot自动扫镜像、找无漏洞标签,还能自动提PR:
创建 .github/workflows/dependabot-docker.yml 文件:
name: Dependabot Docker漏洞扫描 on: schedule: - cron: "0 0 * * *" # 每天凌晨自动扫描 workflow_dispatch: # 支持手动触发 jobs: dependabot-scan: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 初始化Dependabot uses: dependabot/fetch-metadata@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} - name: 运行Docker镜像扫描 uses: dependabot/dependabot-core-action@v1 with: package-ecosystem: "docker" directory: "/" github-token: ${{ secrets.GITHUB_TOKEN }} vulnerabilities: "critical,high"
- 效果:扫描到无漏洞标签后会自动生成PR,PR里会附带漏洞修复说明,直接合并就能更新镜像标签。
2. Trivy Action扫描方案
用Trivy官方Action扫描,输出无漏洞标签清单:
创建 .github/workflows/trivy-docker-scan.yml 文件:
name: Trivy Docker漏洞扫描 on: [schedule, workflow_dispatch] jobs: scan-tags: runs-on: ubuntu-latest steps: - name: 安装Skopeo和jq run: sudo apt-get install -y skopeo jq - name: 获取镜像所有标签 id: get-tags run: echo "tags=$(skopeo list-tags docker://nginx | jq -r '.Tags[] | @csv')" >> $GITHUB_OUTPUT - name: 逐个扫描标签漏洞 run: | IMAGE="nginx" touch scan-results.txt for TAG in ${{ steps.get-tags.outputs.tags }}; do TAG=$(echo $TAG | tr -d '"') VULN_DATA=$(trivy image --severity CRITICAL,HIGH --format json $IMAGE:$TAG) VULN_COUNT=$(echo $VULN_DATA | jq '.Results[].Vulnerabilities | length') if [ "$VULN_COUNT" -eq 0 ]; then echo "✅ $IMAGE:$TAG 无严重/高危漏洞" >> scan-results.txt else echo "❌ $IMAGE:$TAG 存在 $VULN_COUNT 个严重/高危漏洞" >> scan-results.txt fi done - name: 上传扫描结果 uses: actions/upload-artifact@v4 with: name: trivy-scan-results path: scan-results.txt
- 可以扩展:如果需要自动发Issue通知,加个
actions/github-script步骤调用GitHub API创建Issue即可。
常见问题排查(针对你之前的无效情况)
- Dependabot没效果:检查配置文件里
package-ecosystem是不是设成了docker,vulnerabilities选项有没有开启,私有镜像的认证环境变量有没有配置。 - Skopeo拉不到标签:确认镜像仓库是否公开,私有仓库是否已登录,镜像URL格式是否正确(比如私有镜像要写
docker://registry.example.com/your-image)。 - Trivy扫描无结果:先跑
trivy image --update更新漏洞库,确认镜像标签确实存在,检查漏洞等级参数是否正确。
内容的提问来源于stack exchange,提问作者Arun Krish
相关产品推荐
相关产品推荐

