使用Docker镜像构建RPM包
使用Docker镜像构建RPM包
【编者的话】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 <chmouel@enovance.com> 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。
原文发布时间:2015-01-26
本文来自云栖合作伙伴“linux中国”

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
《Python高手之路》——2.5 Doug Hellmann访谈
本节书摘来自异步社区《Python高手之路》一书中的第2章,第2.5节,作者[法]Julien Danjou(朱利安•丹乔), 王飞龙 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.5 Doug Hellmann访谈 我曾经有幸和Doug Hellmann一起工作过数月。他在DreamHost是一位非常资深的软件开发工程师,同时他也是OpenStack项目的贡献者。他发起过关于Python的网站Python Module of the Week(http://pymotw.com/ ),也出版过一本很有名的Pyhton书The Python Standard Library By Example(http://doughellmann.com/python-standard-library-by-example ),同时他也是Python的核心开发人员。我曾经咨询过Doug关于标准库以及库的设计与应用等方面的问题。 当你从头开发一个Python应用时,如何迈出第一步呢?它和开发一个已有的应用程序有什么不同? 从抽象角度看步骤都差不多,但是细节上有所不同。相对于对比开发新...
- 下一篇
《大数据存储:MongoDB实战指南》一1.5 大数据与MongoDB
本节书摘来异步社区《大数据存储:MongoDB实战指南》一书中的第1章,第1.5节,作者: 郭远威 , 彭文波 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.5 大数据与MongoDB 大数据存储:MongoDB实战指南大数据意味着新的机会,企业能够创造新的商业价值。MongoDB这样的数据库可以支撑很多大数据系统,它不仅可以作为一个实时的可操作的大数据存储系统,也能在离线大数据分析系统中使用。利用MongoDB作为大数据的云存储系统,企业能够在全世界范围内存储更多的数据,吸引更多的用户,挖掘更多用户的喜好,创造更多的价值。 选择正确的大数据存储技术,对使用者的应用和目标是非常重要的。MongoDB公司提供的产品和服务能让使用者担更少的风险、花更少的精力提供更好的生产系统产品。事实上,MongoDB天生就是为云计算而生的,其原生的可扩展架构,通过启用分片和水平扩展,能提供云存储所需的技术;此外,它的自动管理被称为“副本集”的冗余服务器,以保持数据的可用性和完整性。MongoDB目前已经成为多家领先的云计算供应商,其中包括亚马逊网络服务、微软和SoftLaye...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS关闭SELinux安全模块
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7设置SWAP分区,小内存服务器的救世主
- Hadoop3单机部署,实现最简伪集群
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池