将环境变量传递给使用 systemctl 启动的服务

将环境变量传递给使用 systemctl 启动的服务

我有一个使用 NodeJs 构建的 nodeJS 服务。此服务需要传递给它一些环境变量。此外,我创建了一个 systemd 单元文件以从 systemctl 启动它。出于某些奇怪的原因,当使用 systemctl 启动时,该服务不会读取环境变量。例如,一个环境变量是 HOST,它包含将绑定 sails 应用程序的 IP。但是,如果我使用帆升力或者节点应用程序.js,它确实读取了环境变量。这是单元文件:

[Unit]
Description=project

[Service]
ExecStart=/usr/bin/node /mnt/project/app.js
Restart=always
StandardOutput=syslog

[Install]
WantedBy=multi-user.target

我什么都试过了。我将环境变量添加到 /etc/environment 并将单元文件指向它,我也将它们添加到单元文件中,但没有任何效果。

答案1

发生这种情况是因为 systemd 中的单元与系统其余部分封装在一起。您是否尝试过像这样直接在单元文件中进行设置?

[Service]
Environment="FOO=foo" 'BAR=bar'

然后变量 FOO 和 BAR 即可在您的单元中使用。例如,如果这是我的 ExecuteStart:

ExecStart=/bin/echo $FOO ${FOO} ${BAR}

使用Environment上面的选项将导致以下输出:

foo foo 酒吧

另一种方法是通过环境配置文件来完成。为此,您可以阅读 fedora 文档:

http://fedoraproject.org/wiki/Packaging:Systemd#EnvironmentFiles_and_support_for_.2Fetc.2Fsysconfig_files

此链接包含一些使用docker的有用示例:

https://www.flatcar.org/docs/latest/setup/systemd/environment-variables/

答案2

我遇到了同样的问题,根本puma没有加载.env文件值(在 ruby​​ on rails web 应用程序上)...

puma.service我所要做的就是使用Environment以下命令定义文件中的值:

sudo vi /etc/systemd/system/puma.service

[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/rails_current_server

Environment="RAILS_ENV=production"
Environment="SERVER_TYPE=111"

ExecStart=/bin/bash -lc 'bundle exec puma -C /home/ubuntu/rails_current_server/config/puma.rb'
Restart=always
KillMode=process

[Install]
WantedBy=multi-user.target

另一种选择是对环境变量的值进行硬编码,如下所示ExecStartExecStart=/bin/bash -lc 'RAILS_ENV=production SERVER_TYPE=111 bundle exec puma -C /home/ubuntu/rails_current_server/config/puma.rb'

相关内容