我有一个使用 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 文档:
此链接包含一些使用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
另一种选择是对环境变量的值进行硬编码,如下所示ExecStart
:ExecStart=/bin/bash -lc 'RAILS_ENV=production SERVER_TYPE=111 bundle exec puma -C /home/ubuntu/rails_current_server/config/puma.rb'