• 微课视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 程序设计
  • 信息安全
微课江湖
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 微课视频
  • bios
  • 系统安装
  • 系统进程
  • Windows
  • LINUX
  • RedHat/Centos
  • Ubuntu/Debian
  • Fedora
  • Solaris
  • 麒麟系统
  • 红旗Linux
  • 苹果MAC
  • 注册表
  • 其它系统
您的位置:首页 > 操作系统 >其它系统 > 创建RPM包的同时构建Docker镜像的方法

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

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-05-12

佚名 通过本文向大家介绍了docker rpm下载,docker镜像,docker镜像仓库,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中运行。


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</div>

DockerFile,为Docker 缓存做了一些优化:


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</div>

以及从容器中运行的start.sh脚本:


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</div>

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-05-12Mac OS X窗口最小化方法的几个快捷键
  • 2017-05-12在CentOS系统中安装NIS服务器的方法
  • 2017-05-12怎么压缩linux vmware虚拟机磁盘空间?
  • 2017-05-12网页提示堆栈溢出解决方法
  • 2017-05-12微软为Surface RT创建USB恢复盘的方法步骤
  • 2017-05-12在vmware10上安装Mac10.8系统的图文教程
  • 2017-05-12suse 10.3 安装http apche2时遇到的rpm依赖问题的解决方法
  • 2017-05-12安装最新的XFCE桌面的教程
  • 2017-05-12回收站清空了如何恢复
  • 2017-05-12KVM或XEN虚拟机应对毒液漏洞的方法

文章分类

  • bios
  • 系统安装
  • 系统进程
  • Windows
  • LINUX
  • RedHat/Centos
  • Ubuntu/Debian
  • Fedora
  • Solaris
  • 麒麟系统
  • 红旗Linux
  • 苹果MAC
  • 注册表
  • 其它系统

最近更新的内容

    • SUSE Linux 10的卸载
    • Vmware虚拟机怎么向Linux虚拟机拖放文件?
    • 使用guestfish来管理KVM容器的详细教程
    • Android 应用将可直接运行于Chrome系统 或将成为Android PC
    • /etc/fstab文件详解
    • 复制“弹出警告窗口”的文字方法介绍
    • 我的文档不见了路径在哪以及找回图标的方法
    • 操作系统移植是指的什么 操作系统移植的含义
    • 几何画板怎么添加辅助线?
    • 将Vmware的镜像格式转换为Virtualbox的镜像格式的方法

关于我们 - 联系我们 - 免责声明 - 网站地图 - 投诉建议

©CopyRight 2015-2017 www.weikejianghu.com Inc All Rights Reserved. 微课江湖 版权所有