創(chuàng)建RPM包的同時(shí)構(gòu)建Docker鏡像的方法

RPM(Red Hat Package Manager)是用于 Linux 分發(fā)版的最常見的軟件包管理器。因?yàn)樗试S分發(fā)已編譯的軟件,所以用戶只用一個(gè)命令就可以安裝軟件。而RPM包的構(gòu)建相當(dāng)繁瑣,并且對(duì)環(huán)境的要求比較高, 本文作者介紹了如何借助Docker來構(gòu)建可以適用多個(gè)平臺(tái)的RPM包。
在一個(gè)內(nèi)部項(xiàng)目中,我一直在思考如何通過非CI工具/流程生成RPM包,我想手動(dòng)生成RPM包,這樣我可以測(cè)試它們是否能正常安裝,并用于正常的冒煙測(cè)試(譯者注:冒煙測(cè)試就是在每日構(gòu)建完成后,對(duì)系統(tǒng)的基本功能進(jìn)行簡單的測(cè)試。這種測(cè)試強(qiáng)調(diào)功能的覆蓋率,而不對(duì)功能的正確性進(jìn)行驗(yàn)證)。
在我們的CI流程中,Docker算是個(gè)全能手,所以我也在想能否將Docker鏡像和RPM結(jié)合起來。理想的情況下,讓RPM與Docker集成, 這樣,創(chuàng)建RPM包的過程其實(shí)就是在構(gòu)建一個(gè)Docker鏡像?;旧?,RPM包的%prep部分的構(gòu)建可以在一個(gè)特殊的Docker鏡像中快速完成,然 后將生成的RPM包返回給主機(jī)。
這種方式的的優(yōu)點(diǎn)在于,你的RPM包是在一個(gè)相對(duì)封閉且可再生的環(huán)境中構(gòu)建的,所以你可以快速的為CentOS、Fedora、RHEL等其它系統(tǒng)構(gòu)建RPM包。
我相信還有其它的一些變通方法也可以完成這樣的工作,比如chroot之類的。但如果在RPM中內(nèi)建這種打包機(jī)制(通過chroot/Docker或者別的容器技術(shù)抽象而來的系統(tǒng)來完成打包工作)的話,我想會(huì)更好。
由于我的項(xiàng)目還沒有完成,所以我只是對(duì)我的想法進(jìn)行了驗(yàn)證:簡單構(gòu)建一個(gè)包含依賴的鏡像。
這是一個(gè)使用PBR生成版本 的Python項(xiàng)目。 首先我在build目錄中生成一個(gè)tarball,然后得到生成的版本號(hào),緊接著修改spec文件中的版本號(hào),然后開始用新的tar包和spec文件構(gòu)建 鏡像。最后運(yùn)行鏡像,并掛載卷(Volume)到本地目錄。當(dāng)運(yùn)行容器中的start.sh腳本之后,鏡像就運(yùn)行起來了。
start.sh相當(dāng)簡單。 它構(gòu)建好RPM包后,以root身份把它拷貝到卷目錄下, 還可以從主機(jī)上將它拷貝到output目錄。我沒有將它拷貝或者說更新到類似swift之類的對(duì)象存儲(chǔ)系統(tǒng),因?yàn)槲疫€要在CI中使用它,所以就使用本地文件拷貝了。
在SPECS/project.spec以及 SOURCES/* 是標(biāo)準(zhǔn)RPM包需要的spec文件,源文件和patch文件。需要做的唯一一件事是定義%define_version宏,并在spec文件中使用它。下面是我的一些腳本。
主腳本build.sh。 可以從CI中運(yùn)行。
set -exf
PROJECT=myproject</p> <p>CURDIR=$(dirname $(readlink -f $0))
TOPDIR=$(git rev-parse --show-topklevel 2>/dev/null)</p> <p>rm -rf ${CURDIR}/.build/rpm
mkdir -p ${CURDIR}/.build/rpm/{BUILD,SRPMS,SPECS,RPMS/noarch}
cp -r ${CURDIR}/SOURCES ${CURDIR}/.build/rpm</p> <p>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</p> <p>sed -e "s/%define _version.*/%define _version ${SALADIER_VERSION}/" ${CURDIR}/SPECS/${MYROJECT}.spec > \
${CURDIR}/.build/rpm/SPECS/${MYPROJECT}.spec</p> <p>docker build -t chmouel/buildrpm ${CURDIR}
docker run -v $CURDIR/.build:/data -it chmouel/buildrpm</p> <p>if [[ -n ${ARTIFACT_DIR} ]];then
rm -rf ${ARTIFACT_DIR}/rpm
cp -a ${CURDIR}/.build/output ${ARTIFACT_DIR}/rpm
fi
DockerFile,為Docker 緩存做了一些優(yōu)化:
MAINTAINER Chmouel Boudjnah <chmouel@enovance.com></p> <p>RUN yum -y groupinstall 'Development Tools'
RUN yum -y install fedora-packager
RUN yum -y install yum-utils</p> <p>RUN yum -y install sudo
RUN sed -i.bak -n -e '/^Defaults.*requiretty/ { s/^/# /;};/^%wheel.*ALL$/ { s/^/# / ;} ;/^#.*wheel.*NOPASSWD/ { s/^#[ ]*//;};p' /etc/sudoers</p> <p>RUN yum install -y https://rdo.fedorapeople.org/rdo-release.rpm</p> <p># 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</p> <p>ADD bin/start.sh /start.sh</p> <p>RUN useradd -s /bin/bash -G adm,wheel,systemd-journal -m rpm</p> <p>WORKDIR /home/rpm
CMD /start.sh</p> <p>ADD .build/rpm/ /home/rpm/rpmbuild/
RUN chown -R rpm: /home/rpm</p> <p>USER rpm
以及從容器中運(yùn)行的start.sh腳本:
# script run inside the container
rpmbuild -ba rpmbuild/SPECS/project.spec || exit 1</p> <p>[[ -d /data ]] || exit 0</p> <p>sudo rm -rf /data/output
sudo cp -a rpmbuild/RPMS/noarch /data/output
腳本可能無法直接在你的環(huán)境中使用,但至少能讓你了解這個(gè)idea。
相關(guān)文章
輕松玩轉(zhuǎn)虛擬機(jī)套娃! 在Hyper-V中開啟嵌套虛擬化的技巧
有辦法在虛擬機(jī)中創(chuàng)建虛擬機(jī)嗎?答案是肯定的,在虛擬機(jī)中運(yùn)行虛擬機(jī)是可能的,我們將其稱為嵌套虛擬化,下面我們就來看看詳細(xì)操作方法2025-02-19龍蜥操作系統(tǒng)Anolis OS-23.x安裝配置圖解教程(保姆級(jí))
本文主要介紹了安裝和配置AnolisOS 23.2系統(tǒng),包括分區(qū)、軟件選擇、設(shè)置root密碼、網(wǎng)絡(luò)配置、主機(jī)名設(shè)置和禁用SELinux的步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-20VMware虛擬機(jī)怎么復(fù)制/克隆/導(dǎo)出VMDK文件?
在處理文件拷貝復(fù)制到VMware虛擬機(jī)中的任務(wù)時(shí),有多種方法可以實(shí)現(xiàn)文件的高效傳輸,使用這些方法,可以在不同的操作系統(tǒng)和環(huán)境下,實(shí)現(xiàn)文件的快速、安全遷移,詳細(xì)請(qǐng)看下文2024-09-24統(tǒng)信 UOS V20 桌面專業(yè)版更新發(fā)布:附更新內(nèi)容匯總
統(tǒng)信 UOS V20 桌面專業(yè)版(1070u1)正式發(fā)布,支持微信掃碼登錄、應(yīng)用窗口縮略圖,海量功能修復(fù),詳細(xì)請(qǐng)看下文介紹2024-08-08怎么看自己IP地址? 不同的操作系統(tǒng)中查看路由器的IP地址的方法
在互聯(lián)網(wǎng)上進(jìn)行網(wǎng)絡(luò)連接,每個(gè)設(shè)備都有一個(gè)唯一的標(biāo)識(shí),即IP地址,本文介紹了如何在不同平臺(tái)上查找路由器的IP地址,包括Windows、Mac、iPhone、iPad、Android、Chrome OS和2024-07-16mware虛擬機(jī)運(yùn)行速度卡慢原因分析及解決辦法
很多人在使用虛擬機(jī)系統(tǒng)的時(shí)候,經(jīng)常對(duì)虛擬機(jī)的運(yùn)行速度不甚滿意,甚至經(jīng)常很惱火,虛擬機(jī)速度慢有很多原因,每個(gè)人需要根據(jù)自己的情況具體分析,本文根據(jù)筆者的使用經(jīng)驗(yàn)將2024-02-21Vmware虛擬機(jī)如何與主機(jī)之間直接復(fù)制粘貼文件?
使用虛擬機(jī)的時(shí)候,遇到了錯(cuò)誤,想要把錯(cuò)誤的代碼或是運(yùn)行情況復(fù)制粘貼到Windows的網(wǎng)上論壇區(qū)求助大神,該怎么操作呢?詳細(xì)請(qǐng)看下文介紹2024-02-21統(tǒng)信UOS V20桌面專業(yè)版(1060)11月更新發(fā)布(附更新內(nèi)容匯總)
國產(chǎn)桌面操作系統(tǒng)統(tǒng)信 UOS V20 專業(yè)版(1060)11月更新發(fā)布,這是統(tǒng)信 UOS V20 專業(yè)版(1060)2023 年度最后一次更新,下面我們就來看看詳細(xì)的更新內(nèi)容2023-12-01統(tǒng)信 UOS 將推 Rust 版 Bash 命令行工具 utshell(附下載地址)
統(tǒng)信 UOS 服務(wù)器版將于不久后推出 Rust 版 Bash,名為 utshell,旨在突破傳統(tǒng) Shell 所面臨的安全限制,詳細(xì)請(qǐng)看下文介紹2023-09-20UOS開機(jī)進(jìn)入busybox界面怎么辦 uos無法進(jìn)入桌面的解決辦法
UOS開機(jī)進(jìn)入busybox界面怎么辦?UOS系統(tǒng)開機(jī)黑屏進(jìn)入busybox界面了,該怎么辦呢?下面我們就來看看uos無法進(jìn)入桌面的解決辦法2023-09-06