日常工作中,当我们需要安装一些较新的软件包时,往往官方只提供了源码而没有提供针对我们所使用的操作系统的安装包。
在企业中需要大规模的安装这个软件时,就需要在每一次安装都编译安装一次。
当然除了编译安装外你还有一个选择,那就是自己制作一个安装包!
但是一般情况下(以centos为例)使用rpmbuild
需要修改大量配置,过于繁琐了。
如果长期需要打包你可以集成到Jenkins内。
但如果只是临时或者偶尔需要打包,你就可以考虑使用FPM
。
本文将解说如何安装FPM
工具。并将以nginx为例使用工具FPM
在centos操作系统中打包rpm安装包。
最后教你如何将FPM
工具封装为docker镜像,以便于快速的搭建打包的环境。
FPM的官方项目地址:github.com/jordansisse…
FPM支持创建除rpm、deb等等的多种类型的安装包
CentOS 7
Nginx-1.16.0
使用FPM打包之前,需要将被打包软件在被安装的环境下编译安装一次,以保证安装包适应环境。 所以打包流程大致是这样的:
1. 编译安装被打包软件
2. 将编译安装好的文件移动到打包上下文目录
3. 创建安装脚本、卸载脚本
4. 安装FPM工具
5. 打包
本文以Nginx-1.16.0作为样例
2.1.1. 首先下载源码
$ wget https://nginx.org/download/nginx-1.16.0.tar.gz
2.1.2. 安装编译所需的软件包
$ yum install -y epel-release
$ yum install -y \
gcc geoip-devel geoip libxslt-devel libxml2-devel gd-devel glibc-devel make openssl-devel pcre-devel zlib-devel jemalloc-devel curl gcc-c++ perl
2.1.3. 编译安装nginx
#先创建一个目录用于打包rpm,将nginx安装在这个目录下并保持文件结构
$ mkdir /fpm-build
$ tar zxf nginx-1.16.0.tar.gz
$ cd nginx-1.16.0
#开始编译安装
$ ./configure \
--user=www \
--group=www \
--build=CentOS7 \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-http_sub_module \
--with-ld-opt=-ljemalloc \
--with-http_flv_module \
--with-http_xslt_module \
--with-http_xslt_module=dynamic \
--with-http_geoip_module \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_realip_module \
--with-http_addition_module \
--prefix=/fpm-build/etc/nginx \
--sbin-path=/fpm-build/usr/sbin/nginx \
--modules-path=/fpm-build/usr/lib64/nginx/modules \
--conf-path=/fpm-build/etc/nginx/nginx.conf \
--http-log-path=/fpm-build/var/log/nginx/access.log \
--error-log-path=/fpm-build/var/log/nginx/error.log \
--pid-path=/fpm-build/var/run/nginx.pid \
--lock-path=/fpm-build/var/run/nginx.lock \
--http-client-body-temp-path=/fpm-build/var/cache/nginx/client_temp \
--http-proxy-temp-path=/fpm-build/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/fpm-build/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/fpm-build/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/fpm-build/var/cache/nginx/scgi_temp \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-stream \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-compat \
--with-select_module \
--with-poll_module \
--with-threads \
--with-file-aio \
--with-http_image_filter_module=dynamic \
--with-pcre-jit
$ make && make install
#接下来创建给systemd读取的启动脚本
$ mkdir /fpm-build/usr/lib/systemd/system
$ cat /fpm-build/usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
#装完以后如果没有报错的话,就能在我们指定的目录里看到nginx的文件了
$ ll /fpm-build
总用量 0
drwxr-xr-x 3 root root 19 7月 23 18:07 etc
drwxr-xr-x 4 root root 31 7月 23 18:07 usr
drwxr-xr-x 4 root root 28 7月 23 18:07 var
2.1.4. 创建安装脚本与卸载脚本
#创建用于放置安装脚本与卸载脚本的目录
$mkdir /fpm-build/tmp
$ cd /fpm-build/tmp
2.1.5. 安装脚本命名为install_after.sh
#安装脚本的主要作用是创建运行应用所需的用户等等
$ cat install_after.sh
#!/usr/bin/env bash
#add user www
source /etc/rc.d/init.d/functions
getent group www > /dev/null || groupadd -r www
getent passwd www > /dev/null || useradd -r -g www -s /sbin/nologin www
2.1.6. 卸载脚本命名为remove_after.sh
cat remove_after.sh
#!/usr/bin/env bash
source /etc/rc.d/init.d/functions
/usr/bin/rm -rf \
/usr/lib/systemd/system/nginx.service \
/usr/lib64/nginx/modules \
/usr/sbin/nginx
FPM是一个用Ruby编程语言构建的工具,所以在安装FPM之前需要安装ruby
2.2.1. 安装环境
$ yum install rubygems ruby-devel rubugems-devel gcc rpm-build make -y
2.2.2. 更换为国内的gem源
$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.com
#更新gem版本
$ gem update --system
2.2.3. 使用gem安装FPM
$ gem install --no-ri --no-rdoc fpm
$ fpm -s dir
-t rpm \ #选择打包的类型,可以是deb或rpm等等等等
-n nginx-wangsu \ #设定软件包的名称
-v 1.16.0 \ #设定软件包的版本
--iteration 1.el7 \ #设定rpm包的版本
-C /fpm-build \ #指定上下文目录
-p /root \ #指定rpm包生成的路径
--description 'Wangsu Nginx rpm For Centos7' \
--url 'www.wangsucloud.com' \
-d 'jemalloc >= 3.5.0,glibc >= 2.16' \
#-d用于设定nginx依赖的软件包,在使用yum安装的时候会根据这个配置解决依赖关系
-m 'laihehui' \ #设定打包人的个人信息
--post-install /root/ng/tmp/install_after.sh \ #设定rpm安装脚本
--post-uninstall /root/ng/tmp/remove_after.sh #设定rpm卸载脚本
#运行命令后出现下面的提示就代表成功打包完毕了
Created package {:path=>"/root/nginx-wangsu-1.16.0-1.el7.x86_64.rpm"}
为了方便在任何环境都能快速打包,避免重复安装FPM,我们可以把FPM做成一个docker镜像。
Dockerfile 请见: github.com/aosolao/FPM…
构建好的镜像请见: hub.docker.com/r/aosolao/f…
3.1. 镜像具体的使用方法
首先创建两个目录,一个目录存放了构建好的nginx,另外一个是空目录用于存放构建好的rpm包。
例如下面的演示中,
/fpm-build/ng
中存放了编译后的nginx,
/fpm-build/rpm
为一个空目录
将两个目录挂载到镜像中,用镜像中的FPM来构建rpm包,
接下来开始构建
$ docker run -d \
-v /fpm-build/ng:/fpm-build/ng \
-v /fpm-build/rpm:/fpm-build/rpm \
aosolao/fpm:v1 \
fpm -s dir \
-t rpm \
-n nginx-wangsu \
-v 1.16.0 \
--iteration 1.el7 \
-C /fpm-build/ng \
-p /fpm-build/rpm \
--description 'Wangsu Nginx rpm For Centos7' \
--url 'www.wangsucloud.com' \
-d 'jemalloc >= 3.5.0,glibc >= 2.16' \
-m 'laihehui' \
--post-install /fpm-build/ng/tmp/install_after.sh \
--post-uninstall /fpm-build/ng/tmp/remove_after.sh
最后查看宿主机的/fpm-build/rpm
路径就能看到构建好的rpm包了
$ ll /fpm-build/rpm
总用量 3.9M
-rw-r--r-- 1 root root 3.9M 7月 24 11:04 nginx-wangsu-1.16.0-1.el7.x86_64.rpm
这样就大功告成啦