我有一个 Java 应用程序(尽管这里的答案应该是相同的,无论它是 Java、Ruby、Python 等)我希望以这样一种方式分发它,当 devops 人员去安装它时,它会自动作为守护进程运行,而无需他们进行任何配置。我的灵感来自于Docker 守护进程,它是用 Go 编写的,但它会自动将自己配置为 Ubuntu 机器上的守护进程。我想做同样的事情,但不知道从哪里开始。
我会想象或者:
- 我需要以某种方式将我的应用程序打包在
deb
;或者 - 将我的应用程序可执行文件与必要的
init
/systemd
/upstart
/等脚本一起发送,这些脚本以某种方式在本地安装,而无需最终用户运行它们。但是,在这种情况下,我不确定如何选择要安装哪些脚本,因为用户可能已init
设置了多个类似工具中的任何一个。
有任何想法吗?
答案1
在 Ubuntu(和 Debian)上,创建deb
软件包是最好的方法,因为一切都可以自动化,因此不需要最终用户的干预。软件包安装或升级不自动化的唯一情况是,如果软件包有一些配置选项需要用户输入(主要在安装期间),或者配置文件被用户修改,并且也被软件包的较新版本修改(在升级期间)。此外,在安装/升级软件包后,它安装的任何启动脚本都会自动启动。
您可以安装多个脚本,并且一切仍能正常工作。在用户计算机上安装和使用的init
情况下,如果同时存在一个脚本和一个用于同一服务的脚本,则忽略该脚本并使用该脚本。systemd
init
systemd
init
systemd
就打包本身而言,Debian 提供了辅助脚本,这些脚本(除其他功能外)会自动安装您提供的任何启动脚本(我不认为upstart
他们的辅助脚本支持此功能,因为这仅在 Ubuntu 上使用)并启动服务。有关打包的示例,请参阅这 debian
包的文件夹dump1090-mutability
。(免责声明:这是我的 Github 帐户)请注意,文件dump1090-mutability.init
包含init
脚本,而dump1090-mutability.service
文件包含脚本systemd
。请注意,这些文件的名称应该是package-name.init
和package-name.service
,其中package-name
是正在创建的二进制包的名称。(有关 systemd 情况,请参阅man dh_systemd_enable
和。)man dh_systemd_start
在打包时,这两个文件都放置在用户系统上的相应目录中,然后启动服务。对于文件rules
,我建议您使用类似以下内容,以便您从自动化中受益(请参阅这部分--with systemd
):
#!/usr/bin/make -f
%:
dh $@ --with systemd
override_dh_auto_build:
# Specify how to build the Java files here, if there is no Makefile provided
override_dh_auto_install:
# Specify how to install the Java files here, if there is no `install` target in the Makefile. Don't worry about anything in the `debian` directory unless you need to install some icons.
- 如果您的应用没有 Makefile,而只是 Java 源文件的集合,请填写
override_dh_auto_build
(源文件编译并打包成 JAR 的位置)和override_dh_auto_install
(JAR 的安装位置)。 - 如果您的应用程序有 Makefile,但没有
install
目标,请删除override_dh_auto_build
目标并填写override_dh_auto_install
。 - 如果您的应用程序有一个 Makefile 并且有一个
install
目标(可以使用),请删除这两个目标。 - 如果您的应用程序只是一个 JAR 文件,请删除
override_dh_auto_build
,并填写override_dh_auto_install
。