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

时间:2023-07-09 20:21:40 

这篇文章主要介绍了创建RPM包的同时构建Docker镜像的方法,针对目前火热的Docker容器,本文中给出了这样一个尝试,需要的朋友可以参考下

RPM(Red Hat Package Manager)是用于 Linux 分发版的最常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。而RPM包的构建相当繁琐,并且对环境的要求比较高, 本文作者介绍了如何借助Docker来构建可以适用多个平台的RPM包。

在一个内部项目中,我一直在思考如何通过非CI工具/流程生成RPM包,我想手动生成RPM包,这样我可以测试它们是否能正常安装,并用于正常的冒烟测试(译者注:冒烟测试就是在每日构建完成后,对系统的基本功能进行简单的测试。这种测试强调功能的覆盖率,而不对功能的正确性进行验证)。

在我们的CI流程中,Docker算是个全能手,所以我也在想能否将Docker镜像和RPM结合起来。理想的情况下,让RPM与Docker集成, 这样,创建RPM包的过程其实就是在构建一个Docker镜像。基本上,RPM包的%prep部分的构建可以在一个特殊的Docker镜像中快速完成,然 后将生成的RPM包返回给主机。

这种方式的的优点在于,你的RPM包是在一个相对封闭且可再生的环境中构建的,所以你可以快速的为CentOS、Fedora、RHEL等其它系统构建RPM包。

我相信还有其它的一些变通方法也可以完成这样的工作,比如chroot之类的。但如果在RPM中内建这种打包机制(通过chroot/Docker或者别的容器技术抽象而来的系统来完成打包工作)的话,我想会更好。

由于我的项目还没有完成,所以我只是对我的想法进行了验证:简单构建一个包含依赖的镜像。

这是一个使用PBR生成版本 的Python项目。 首先我在build目录中生成一个tarball,然后得到生成的版本号,紧接着修改spec文件中的版本号,然后开始用新的tar包和spec文件构建 镜像。最后运行镜像,并挂载卷(Volume)到本地目录。当运行容器中的start.sh脚本之后,镜像就运行起来了。

start.sh相当简单。 它构建好RPM包后,以root身份把它拷贝到卷目录下, 还可以从主机上将它拷贝到output目录。我没有将它拷贝或者说更新到类似swift之类的对象存储系统,因为我还要在CI中使用它,所以就使用本地文件拷贝了。

在SPECS/project.spec以及 SOURCES/* 是标准RPM包需要的spec文件,源文件和patch文件。需要做的唯一一件事是定义%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

# This is an optimisation for caching, since using the auto generated one will
# make docker always run the builddep steps since new file
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

脚本可能无法直接在你的环境中使用,但至少能让你了解这个idea。

标签:RPM,Docker
0
投稿

猜你喜欢

  • 电脑怎么设置开机启动项?电脑设置电脑开机启动项教程

    2023-11-01 06:45:14
  • Win8系统玩LOL一打字就卡怎么办?

    2022-02-16 13:57:03
  • Excel 调整行高列宽的方法,告诉大家Excel 如何设置行高列宽

    2023-03-16 17:55:44
  • win7精简版怎么安装重装系统_win7精简版安装重装系统方法步骤教程

    2023-05-03 11:50:47
  • 石墨文档怎么用_石墨文档使用教程汇总

    2023-07-27 12:24:33
  • ppt如何将汉字笔画制作成背景图?ppt将汉字笔画制成背景图的方法

    2023-08-01 19:07:32
  • 在CrossOver 18 for Mac中如何删除Windows应用程序或bottle?

    2022-10-01 01:07:07
  • WPS 如何用 Shift 键快速删除或创建多个Excel工作表

    2022-11-17 15:41:41
  • win10怎么更改标题栏、菜单、消息框、工具提示的字体大小?

    2022-06-29 20:02:41
  • Win7系统计划任务在哪里?如何开启计划任务功能?

    2022-12-02 01:03:25
  • 微信强提醒功能怎么使用 微信强提醒功能使用方法

    2023-08-07 08:32:35
  • 网络共享找不到计算机名字怎么办_网络共享找不到计算机名字解决教程

    2023-11-11 08:24:21
  • 文艺清新甜美人像lr滤镜,甜美一夏

    2022-02-06 23:55:37
  • U盘装Win7系统之后u盘文件无法删除怎么办?

    2022-08-19 07:36:54
  • Excel如何设置银行贷款提前自动到期提醒

    2022-07-18 09:15:36
  • shsh在哪里备份?在哪里可以下载到shsh?

    2023-09-17 18:02:15
  • 查找引用类excel函数——VLOOKUP函数的使用方法

    2023-09-24 03:35:45
  • Win7系统dns缓存一直清除不了怎么办?

    2023-03-22 12:06:02
  • 苹果发布最新公测版 iOS 13.6:修复 Bug 为 iOS 14 做准备

    2023-01-11 04:40:51
  • excel2003条件求和的函数使用方法

    2022-02-10 12:11:58
  • asp之家 电脑教程 m.aspxhome.com