平常工做中,當咱們須要安裝一些較新的軟件包時,每每官方只提供了源碼而沒有提供針對咱們所使用的操做系統的安裝包。nginx
在企業中須要大規模的安裝這個軟件時,就須要在每一次安裝都編譯安裝一次。c++
固然除了編譯安裝外你還有一個選擇,那就是本身製做一個安裝包!git
可是通常狀況下(以centos爲例)使用rpmbuild
須要修改大量配置,過於繁瑣了。github
若是長期須要打包你能夠集成到Jenkins內。web
但若是隻是臨時或者偶爾須要打包,你就能夠考慮使用FPM
。docker
本文將解說如何安裝FPM
工具。並將以nginx爲例使用工具FPM
在centos操做系統中打包rpm安裝包。編程
最後教你如何將FPM
工具封裝爲docker鏡像,以便於快速的搭建打包的環境。centos
FPM的官方項目地址:github.com/jordansisse…ruby
FPM支持建立除rpm、deb等等的多種類型的安裝包bash
CentOS 7
Nginx-1.16.0
使用FPM打包以前,須要將被打包軟件在被安裝的環境下編譯安裝一次,以保證安裝包適應環境。 因此打包流程大體是這樣的:
1. 編譯安裝被打包軟件
2. 將編譯安裝好的文件移動到打包上下文目錄
3. 建立安裝腳本、卸載腳本
4. 安裝FPM工具
5. 打包
複製代碼
本文以Nginx-1.16.0做爲樣例
$ wget https://nginx.org/download/nginx-1.16.0.tar.gz
複製代碼
$ 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
複製代碼
#先建立一個目錄用於打包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
複製代碼
#建立用於放置安裝腳本與卸載腳本的目錄
$mkdir /fpm-build/tmp
$ cd /fpm-build/tmp
複製代碼
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
複製代碼
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
$ yum install rubygems ruby-devel rubugems-devel gcc rpm-build make -y
複製代碼
$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.com
#更新gem版本
$ gem update --system
複製代碼
$ 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<laihh@wangsu.com>' \ #設定打包人的我的信息
--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…
首先建立兩個目錄,一個目錄存放了構建好的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<laihh@wangsu.com>' \
--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
複製代碼
這樣就大功告成啦