如何不运行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
相关产品推荐
相关产品推荐

