Linux应用打包
这里的Linux打包其实总共分以下几类, 更多是方便内网一键部署的情况:
Debian(.deb)系列包系统:dpkg -i xxx.deb(安装)|dpkg -r xxx(卸载)RedHat(.rpm)系列包系统:rpm -ivh xxx.rpm(安装)|rpm -e xxx.rpm(卸载)Docker直接编写Dockerfile 和 docker-compose部署
一般来说如果是打包有分为
命令行和桌面应用, 这里主要是用于部署服务端所以采用命令行操作
这里需要先采用 debian 打包方式说明, 适用于 Debian|Ubuntu 系列的虚拟环境, 其他因为不常用所以后续再补充.
deb打包
实际上需要按照以下命令来做打包:
# 按照文件夹规则放置到其中
dpkg -b 文件夹名称 安装包名称
# 比如以下方式打包, fusion-gateway 是当前目录下的子目录
dpkg -b fusion-gateway fusion-gateway_1.0_amd64.deb
按照以下流程测试打包名为 fusion-gateway 的应用, 该应用基于 Java17-Jre 依赖启动:
# 创建并进入目录之中, 注意 DEBIAN 目录是必须的
mkdir -p fusion-gateway/DEBIAN && cd fusion-gateway/DEBIAN
# 之后就是包信息文件 control
# 关键字首字母大写, 冒号后面必须有空格
# 必填字段: Package、Version、Architecture、Maintainer、Description,且内容不能为空
touch control
# postinst(安装后脚本) | prerm(卸载前脚本)
# 注意权限必须要 <= 775, 否则会出现包安装失败
touch postinst && chmod 755 postinst
touch prerm && chmod 755 prerm
这里为了演示移动文件, 所以下载个 MIT 许可文件放入依赖目录安装之后自动创建目录和移动文件,
文件地址为: MIT License,
下载或者复制内容之后命名为 License.
参考 debian打包策略
这里首先就是 control 包信息配置, 需要遵循以下字段:
所以这里最后 fusion-gateway 包信息如下( 注意包名特殊符号只能包含 -+. ):
Package: fusion-gateway
Version: 2025.3.29
Description: fusion gateway application
Section: net
Priority: standard
Architecture: amd64
Maintainer: MeteorCat
Pre-Depends: openjdk-17-jre, subversion
配置内部表明需要在脚本部署之前安装 openjdk-17-jre 和 subversion,
如果没有该本地环境没有该引用会提示错误信息:
Selecting previously unselected package fusion-gateway.
dpkg: regarding fusion-gateway-2025.3.29.deb containing fusion-gateway, pre-dependency problem:
fusion-gateway pre-depends on subversion
subversion is not installed.
这里将 license 文件放入目录其中, 注意目前 deb 的根目录就是安装部署服务的根目录:
# 一般自己编写的依赖包文件最好放置 /usr/local 目录之中
# 注意这里必须要 DEBIAN 上级目录, 也就是 fusion-gateway 目录作为根目录
mkdir -p ../usr/local/fusion/gateway
# 将文件写入内部当中
touch ../usr/local/fusion/gateway/license
之后就是安装执行脚本 postinst, 现在仅仅做个创建目录操作和移动 README.md 的操作:
#!/bin/sh
# create directory
mkdir -p /usr/local/fusion/gateway
chmod -R 755 /usr/local/fusion/gateway
最后就是卸载删除的脚本 prerm, 实际上直接直接清理就行了:
#!/bin/sh
# remove directory
rm -rf /usr/local/fusion/gateway
之后直接测试打包自己的应用包:
cd ../../ # 回到 fusion-gateway 上级目录
dpkg -b fusion-gateway/ fusion-gateway-2025.3.29.deb # 打包为 *.deb 包
# 最后再同目录下生成的包
# fusion-gateway-2025.3.29.deb
# 这里最后测试下安装和卸载
sudo dpkg -i fusion-gateway-2025.3.29.deb
# 之后查看目录
ls /usr/local/fusion/gateway
# 最后没问题就卸载软件就行了, 没问题之后就能看到目录直接删除
sudo dpkg -r fusion-gateway
这里就是一个简单 deb 包软件, 内部其实带有很大隐患需要处理, 接下来就是指出和修复内部问题.
问题修复
上面虽然最后打包成功, 但是也暴露很多问题:
- 权限控制, 如果后台服务类最好构建出单独 linux 账号来指定运行服务
- 可执行冲突, 前往不要全局安装
jre或者其他可执行, 可能会导致本来使用全局的服务应用因升级|降级奔溃 - 日志导出, 如果有需要配置日志需要在
/var/log构建好对应应用名录并写入 - 配置归类, 系统应用应该统一写入在
/etc目录之中 - 系统注册, 需要将持久后台服务注册到
systemd之中持续运行
实际测试发现打包成 deb 的流程并不比 docker 慢, 首先确定需要安装脚本 postinst 的操作:
#!/bin/sh
# create authority
useradd -M -s /usr/sbin/nologin fusion
# create directory
mkdir -p /usr/local/fusion/gateway
mkdir -p /var/log/fusiion
# change permission
chmod -R 755 /usr/local/fusion
chmod -R 755 /var/log/fusiion
chwon -R fusion:fusion /usr/local/fusion
chown -R fusion:fusion /var/log/fusiion
# download jre by zulu-java
# url: https://cdn.azul.com/zulu/bin/zulu17.56.15-ca-jre17.0.14-linux_x64.tar.gz
这里面实际上可以考虑直接 zulujdk 要么直接 wget 下载最新版本到 /usr/local/fusion 目录之中,
也可以官网下载之后之后追加打包丢在包内, 内网开发有时候没办法访问外网或者网络问题导致无法连接,
所以这里还是推荐直接去下载放到包内一起同步安装:
# 在打包目录之中创建 jre 目录用于放入执行二进制文件
# 这里把 zulu jre 的下载安装包解压放入其中就行了
mkdir -p fusion-gateway/usr/local/fusion/jre
cd fusion-gateway/usr/local/fusion/jre
# 官网直接下载 jre
wget -t 2 -T 10 -O jre17.tar.gz "https://cdn.azul.com/zulu/bin/zulu17.56.15-ca-jre17.0.14-linux_x64.tar.gz"
# 解压 jre 到当前目录, 可以考虑压缩文件保存不需要删除
tar -zxvf jre17.tar.gz --strip-components=1
并且还需要追加 systemd 的服务文件, 让其跟随一起创建注册服务:
# 在打包目录之中在系统目录创建生成 `fusion-gateway.service` 的 java 网关服务
mkdir -p fusion-gateway/usr/lib/systemd/system
cd fusion-gateway/usr/lib/systemd/system
# 创建系统服务文件, 注意服务文件一般是 root 操作
sudo touch fusion-gateway.service
卸载脚本 prerm 需要做清理工作, 这里没有加入 systemd 关闭操作, 建议正式环境清理之前停止服务再清理:
#!/bin/sh
# remove directory
rm -rf /usr/local/fusion/gateway
rm -rf /usr/local/fusion
rm -rf /var/log/fusiion
# remove user
userdel -r fusion
rm -rf /usr/lib/systemd/system/fusion-gateway.service
最后指定重新重新执行打包命令出包即可:
# 重新打包成 deb
dpkg -b fusion-gateway/ fusion-gateway-2025.3.30.deb # 打包为 *.deb 包
# 测试安装 deb 包, 注意内部有设计 root 的 service, 需要 root 权限
sudo dpkg -i fusion-gateway-2025.3.30.deb
# 可以看到 jre 版本
/usr/local/fusion/jre/bin/java -version
# 最后删除包就行了
sudo dpkg -r fusion-gateway
这里就完全隔离环境部署出 linux 的包, 如果需要假设其他环境基本只需要安装这个包即可.