You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不运行Red Hat基础镜像,用rpm列出已安装系统包并实现自动化?

解决Docker镜像系统包(RPM/DPKG)自动化检查问题

现有问题梳理

  • 基于Red Hat(RPM)/ Ubuntu(DPKG)基础镜像构建的应用镜像,需定期核查已安装系统包(如libxml2、expat)版本,用于安全漏洞检测
  • 部分镜像使用latest标签,需要自动化的版本核查机制
  • 当镜像入口点为java -jar这类无法直接启动交互式容器的情况时,当前需构建带长运行主类的镜像后再用docker exec执行命令,操作繁琐
  • 尝试过dive、docker save、docker history等方式,均无法高效获取完整的包列表信息

可行解决方案

1. 临时覆盖入口点执行包查询命令

无需修改或重新构建镜像,直接通过docker run指定临时入口点和命令,执行后容器自动退出:

  • RPM系镜像(Red Hat/CentOS等):
    docker run --rm --entrypoint=/bin/bash <镜像名称/ID> -c "rpm -qa"
    
  • DPKG系镜像(Ubuntu/Debian等):
    docker run --rm --entrypoint=/bin/bash <镜像名称/ID> -c "dpkg -l"
    

若镜像内无bash,可替换为sh:

docker run --rm --entrypoint=/bin/sh <镜像名称/ID> -c "rpm -qa"

该方法跳过原入口点,直接执行包查询命令,完美解决入口点为java -jar无法交互的问题。

2. 提取镜像内包管理数据库本地分析

针对无法拉取或运行镜像的离线场景,可通过docker create创建临时容器,复制包管理数据库到本地后分析:

  • RPM数据库处理:
    # 创建临时容器
    CONTAINER_ID=$(docker create <镜像名称/ID>)
    # 复制RPM数据库到本地
    docker cp $CONTAINER_ID:/var/lib/rpm ./rpm_db
    # 删除临时容器
    docker rm $CONTAINER_ID
    # 本地用rpm工具分析(需本地安装rpm)
    rpm --dbpath ./rpm_db -qa
    
  • DPKG数据库处理:
    CONTAINER_ID=$(docker create <镜像名称/ID>)
    docker cp $CONTAINER_ID:/var/lib/dpkg/status ./dpkg_status
    docker rm $CONTAINER_ID
    # 本地解析包状态文件
    cat ./dpkg_status | grep -E "^Package:|^Version:" | paste - -
    

3. 批量镜像检查自动化脚本

编写Shell脚本批量处理镜像列表,自动识别包管理系统并输出结果:

#!/bin/bash

# 待检查的镜像列表,可替换为远程仓库镜像名
IMAGES="my-app:latest payment-service:v2.1"

for IMAGE in $IMAGES; do
  echo "=== 正在检查镜像: $IMAGE ==="
  # 判断是否为RPM系镜像
  if docker run --rm --entrypoint=/bin/sh $IMAGE -c "rpm --version" >/dev/null 2>&1; then
    docker run --rm --entrypoint=/bin/sh $IMAGE -c "rpm -qa"
  elif docker run --rm --entrypoint=/bin/sh $IMAGE -c "dpkg --version" >/dev/null 2>&1; then
    docker run --rm --entrypoint=/bin/sh $IMAGE -c "dpkg -l"
  else
    echo "无法识别该镜像的包管理系统"
  fi
  echo -e "\n"
done

4. 集成漏洞扫描工具

若核心需求是漏洞检测,可直接使用支持镜像包分析的扫描工具:

  • 工具会自动识别RPM/DPKG包,匹配CVE数据库输出漏洞详情
  • 无需手动提取包列表,简化安全检查流程

关于Docker原生功能的建议

若希望Docker官方支持该功能,可提交需求时明确以下诉求:

  • 新增子命令或扩展docker inspect功能,自动检测镜像内的包管理系统(RPM/DPKG)
  • 直接输出已安装包的名称、版本信息,无需启动容器
  • 支持远程仓库镜像的离线分析,无需拉取完整镜像文件

内容的提问来源于stack exchange,提问作者WesternGun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:26:01