当前位置: 首页
系统平台
同时创建RPM包与构建Docker镜像的方法

同时创建RPM包与构建Docker镜像的方法

热心网友 时间:2026-06-16
转载

RPM(Red Hat Package Manager)是 Linux 系统中最主流的软件包管理工具之一,其优势在于用户只需一条命令即可安装预编译的软件。然而,自行构建 RPM 包却颇具挑战——依赖环境复杂、操作步骤繁多,稍有不慎就会出错。本文介绍一种巧妙的解决方案:利用 Docker 容器技术构建

RPM(Red Hat Package Manager)是 Linux 系统中最主流的软件包管理工具之一,其优势在于用户只需一条命令即可安装预编译的软件。然而,自行构建 RPM 包却颇具挑战——依赖环境复杂、操作步骤繁多,稍有不慎就会出错。本文介绍一种巧妙的解决方案:利用 Docker 容器技术构建可跨平台使用的 RPM 包,使打包流程变得清晰、可重复且易于移植。

我们一直期望能够脱离持续集成(CI)工具,手动生成 RPM 包,以便在部署前验证安装是否正常并执行冒烟测试。而在我们的 CI 流程中,Docker 几乎无所不能,那么能否将 Docker 镜像与 RPM 打包整合在一起?理想情况下,构建 RPM 包的过程本质上就是构建 Docker 镜像:RPM 包的 %prep 阶段在特制的 Docker 镜像中高效完成,最终生成的 RPM 包原封不动地返回宿主机。这样一来,打包环境便实现了封闭且可复现,为 CentOS、Fedora、RHEL 乃至其他 Linux 发行版构建 RPM 包都变得异常便捷。

当然,并非没有其他变通方案,例如使用 chroot 环境。然而,如果在 RPM 构建过程中直接内建容器化机制(通过 chroot、Docker 或其他容器技术抽象的系统来完成打包),无疑是更加优雅的途径。由于该项目尚未完全落地,本文先验证一个核心思路:快速构建一个包含必要依赖的镜像。

该项目使用 PBR 自动生成版本号,其整体流程如下:首先在 build 目录下生成 tarball 并提取版本号,随后修改 spec 文件中的版本号,再利用新的 tar 包和 spec 文件构建 Docker 镜像。最后运行容器,将卷挂载至本地目录,待容器内的 start.sh 执行完毕后,RPM 包即可获得。

start.sh 的逻辑非常简洁:构建完 RPM 后,以 root 权限将其复制到卷目录中,宿主机即可从 output 目录获取生成的文件。此处并未使用对象存储等中间方案,因为在 CI 流程中,简单的本地拷贝已完全满足需求。

目录 SPECS/project.specSOURCES/* 存放了标准 RPM 包所需的 spec 文件、源码及补丁文件。唯一需要留意的是正确定义 %define_version 宏,并在 spec 文件中正确引用。下面展示几个关键脚本,尽管不能直接拿来使用,但足以让你领略这一构建思路的精妙之处。

以下为主构建脚本 build.sh,可直接从 CI 环境中调用:

#!/bin/bash
set -exf

PROJECT=myproject
CURDIR=$(dirname $(readlink -f $0))
TOPDIR=$(git rev-parse --show-topklevel 2>/dev/null)

rm -rf ${CURDIR}/.build/rpm
mkdir -p ${CURDIR}/.build/rpm/{BUILD,SRPMS,SPECS,RPMS/noarch}
cp -r ${CURDIR}/SOURCES ${CURDIR}/.build/rpm

pushd ${TOPDIR} >/dev/null
python setup.py sdist --dist-dir ${CURDIR}/.build/rpm/SOURCES/
SALADIER_VERSION=$(sed -n '/^Version/ { s/.* //; p}' ${PROJECT}.egg-info/PKG-INFO)
popd >/dev/null

sed -e "s/%define _version.*/%define _version ${SALADIER_VERSION}/" ${CURDIR}/SPECS/${MYROJECT}.spec > \
        ${CURDIR}/.build/rpm/SPECS/${MYPROJECT}.spec

docker build -t chmouel/buildrpm ${CURDIR}
docker run -v $CURDIR/.build:/data -it chmouel/buildrpm

if [[ -n ${ARTIFACT_DIR} ]];then
    rm -rf ${ARTIFACT_DIR}/rpm
    cp -a ${CURDIR}/.build/output ${ARTIFACT_DIR}/rpm
fi

接下来是 Dockerfile,其中包含一系列 Docker 缓存优化策略:

FROM fedora:21
MAINTAINER Chmouel Boudjnah 

RUN yum -y groupinstall 'Development Tools'
RUN yum -y install fedora-packager
RUN yum -y install yum-utils
RUN yum -y install sudo
RUN sed -i.bak -n -e '/^Defaults.*requiretty/ { s/^/# /;};/^%wheel.*ALL$/ { s/^/# / ;} ;/^#.*wheel.*NOPASSWD/ { s/^#[ ]*//;};p' /etc/sudoers
RUN yum install -y https://rdo.fedorapeople.org/rdo-release.rpm

# 利用缓存优化:把spec文件提前放进去,避免每次构建都重跑builddep
ADD SPECS/project.spec /tmp/
RUN yum-builddep -y /tmp/project.spec

ADD bin/start.sh /start.sh
RUN useradd -s /bin/bash -G adm,wheel,systemd-journal -m rpm
WORKDIR /home/rpm
CMD /start.sh

ADD .build/rpm/ /home/rpm/rpmbuild/
RUN chown -R rpm: /home/rpm
USER rpm

最后是容器内部执行的启动脚本 start.sh

#!/bin/bash
# script run inside the container
rpmbuild -ba rpmbuild/SPECS/project.spec || exit 1

[[ -d /data ]] || exit 0
sudo rm -rf /data/output
sudo cp -a rpmbuild/RPMS/noarch /data/output

这些脚本可能无法在你的环境中直接运行,但核心思路已清晰呈现:利用 Docker 将 RPM 打包环境彻底隔离,实现纯净且易于移植的构建流程,绝对值得一试。

来源:https://www.jb51.net/os/other/349674.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
CentOS 7手动释放内存缓存的详细方法

CentOS 7手动释放内存缓存的详细方法

手动清理Linux内存缓存需先执行三次sync防丢数据。echo1清页缓存,echo2清目录与inode缓存,echo3全清但慎用。清理前依据available而非free判断内存压力,清理后关注available及swap使用率。

时间:2026-07-13 07:34
Mac菜单栏查看当前WiFi频率的实用方法

Mac菜单栏查看当前WiFi频率的实用方法

Mac无需第三方工具,按住Option键点击菜单栏Wi-Fi图标即可查看频率或信道;使用无线诊断工具的扫描信息可确认频段;系统报告中的PHYMode字段显示硬件级协商结果,三种方法覆盖从桌面快捷查看到底层验证。

时间:2026-07-13 07:33
CentOS 7系统默认语言修改方法

CentOS 7系统默认语言修改方法

CentOS7修改默认语言需先安装zh_CN UTF-8语言包,再通过localectl或 etc locale conf设置LANG为zh_CN UTF-8。修改后验证locale输出,注意避免LC_*变量覆盖,图形界面与日志可能需额外处理。

时间:2026-07-13 07:33
Linux查看具体磁盘逻辑卷管理组坏块屏蔽记录

Linux查看具体磁盘逻辑卷管理组坏块屏蔽记录

LVM本身不记录或管理坏块,坏块屏蔽由文件系统(如e2fsck将坏块列表写入超级块)和硬盘固件(如S M A R T 重映射)处理。用户需绕过LVM层,必须直接检查物理设备(如 dev sdb2)的坏块列表及重映射计数等信息,才能确认其屏蔽记录情况。

时间:2026-07-13 07:33
银河麒麟系统Prometheus安装配置方法详解

银河麒麟系统Prometheus安装配置方法详解

在银河麒麟系统上部署Prometheus,需先确认CPU架构(ARM64或AMD64),下载对应安装包,创建标准目录并解压。接着配置自监控,创建非root用户,手动启动验证。最后注册为systemd服务,实现开机自启。注意配置文件路径及权限设置。

时间:2026-07-13 07:33
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜