如何使用 systemd-nspawn、systemd-run 将容器中的程序作为服务启动?

如何使用 systemd-nspawn、systemd-run 将容器中的程序作为服务启动?

unoconv如何使用 在容器内运行侦听程序(特别是作为侦听器) systemd-nspawn,以便它可以在后台运行(没有控制台)并被其他进程访问?例如,在一个完美的世界中,它会像这样简单:

# something like this to start the container and program in background
systemd-nspawn -D <container path> --background <unoconv --listener> 

# something like this to connect to container and execute command
systemd-run --machine <machine name> <unoconv -f pdf file.txt>

到目前为止我最远的是使用驯服 systemd-nspawn 以运行容器,这使得容器在后台运行machinectl。然而,

sudo systemd-run --machine <machine name> ls

失败并出现错误:

Failed to create bus connection: Permission denied.

我的问题有两个方面。一、你能解决这个错误吗?或者两个(最好)您能给我一种更简单的方法来启动并连接到容器并运行命令吗?

(我在一台无法访问互联网的安全机器上运行 Ubuntu Xenial)

答案1

我认为这取决于您想要运行容器的频率和时间。

如果您希望在 Ubuntu 加载后、每次计算机启动时立即运行此程序,那么我建议您尝试启动应用程序设置。您可以添加任何充当终端命令的功能作为启动“应用程序”进程。或者,您可以组合一个脚本,然后将脚本作为启动进程运行,这将为您提供更好的控制。 (请记住,启动应用程序列表中的项目在按字母顺序通过名称字段,因此如果执行顺序很重要,请相应地命名或仅创建一个启动脚本并使其成为唯一的调用.)

如果您想在特定的重复时间/日期运行该程序,我建议您组合一个 cron 作业来执行相同的操作。

如果你想按需运行它......对此不确定。我对 systemd-nspawn 不太熟悉;也许这篇文章或者本文会有帮助的。

对于问题1,我很困惑。机器名称可能有拼写错误?容器操作系统权限与 systemd-run 身份验证选项不匹配?你可以尝试sshd或者一个码头集装箱如果没有别的办法。

当然,如果您实际上输入的是“ --machine <machine name>”,将其更改为“ --machine=<machine name>”可能会修复它。 :P

相关内容