创建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。


猜你喜欢
- IRQL NOT LESS OR EQUAL是Win10系统中常见的蓝屏错误,没想到用户升级Win11系统之后还是没有逃过这个蓝屏问题。那么
- 这是一个将文字 (Word) 档案转换成资料图片(JPEG)格式的方法,非常简单。用这个方法,你就能把文件作为桌面壁纸。你也可以把图片保存下
- Windows10系统的“快速访问”功能很容易泄露电脑中的隐私,用什么方法可以让这个功能消失,避免电脑的个人隐私泄露呢?修改Windows1
- 倒班助手app怎么获取倒班小纸条?倒班助手app是一款非常好用倒班软件,在倒班助手app中用户还可以获取获取倒班小纸条,你知道要怎么获取吗?
- ToDesk是一款很实用的远程控制软件,不仅延迟低,而且操作起来还简单便捷,因此有不少小伙伴都在使用,但最近有用户在使用的时候发现自己ToD
- amd全系列cpu天梯图,amd处理器排行榜天梯图2022,amd cpu是当下最热门的电脑处理器品牌之一,当你想要更好的选择cpu时,可以
- 百度地图怎么使用?很多小伙伴都用了很久的百度地图却不知道其中的一些功能使用,下面,小编就为大家介绍下百度地图使用方法。打开百度地图APP,输
- 我们在利用Word 2007制作试卷或调查问卷时,在试卷、调查问卷中,如何让选择题中各个选项自动对齐?下面小编就为大家详细介绍一下,来看看吧
- 相信有不少用户都喜欢使用谷歌浏览器,并且我们在使用谷歌浏览器的时候经常会安装各种插件来丰富其功能,而最近有用户反馈说自己的的谷歌浏览器无法加
- 在有电脑的时候,WiFi共享是很常见的,那么在MAC电脑上怎么进行WiFi共享呢?许多用户都不太清楚,今天小编就给大家介绍一下这个问题的解决
- 我们使用的每天电脑里面都是有bios接口的,如果没有bios我们是无法开启电脑的,很多朋友不知道bios设置硬盘启动要怎么操作,今天小编就来
- 苹果今天发布全新设计的 iMac !全新设计的外观,还有 7 款颜色可选,分别是蓝色、绿色、粉色、银色、黄色、橙色、紫色。性能方面,全新 i
- 1.打开需要标记关键词的Word文档,点击工具栏的“编辑”→“查找”。 2.在查找与替换里输入需要查找的关键词,接
- 今天为大家带来一些实用的捷径分享,改善生活质量。获取后无需设置,直接可以使用。闪念胶囊将一闪而过的灵感快速记录存入备忘录,不再忘记重要的想法
- 由于Windows 11 采用了新款的右键菜单风格,有些用户很不习惯,很想切换到win10的风格。那么,怎样切换才能切换到win10的风格呢
- 在公式中,当出现无效的单元格引用时,公式返回 #REF! 错误。通常,有以下两种情况导致#REF! 错误:在公式中引用的单元格被删除时。在公
- 回字形的动画制作,相信大家没想过是用PowerPoint制作出来的吧,我这里所讲的回字形,就是先外部顺时针,向内部移动,类似于中国古汉字里面
- win7是现在不少电脑爱好者都十分喜爱使用的一款电脑系统,但是我们都知道,再好的电脑系统也会让我们时不时感到自己使用的电脑网速缓慢,网速不给
- 经常的意外断电、非法关机、过度优化都可能导致Windows10系统文件的缺失或损坏,从而在运行时出现各种意想不到的错误。遇到这种情况,其实我
- win10网络被限速,会让用户在需要下载或者连接办公的时候非常恼火,在正常的情况下,系统会保留一些网速以免影响连接的稳定,那要怎么解除网络被