我有一个作为系统服务运行的springboot应用程序。我的systemd应用程序服务文件如下所示:
[Unit]
Description=app name
After=syslog.target
[Service]
EnvironmentFile=/etc/environment
User=springboot
ExecStart="/opt/jar-folder-name/app-name.jar"
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target在/etc/environment文件中,指定了一个环境变量:
SOME_ENV_VAR=SOME_VALUE.THAT_CONTAINS_STUFF
在我的springboot应用程序中,我尝试使用System.getenv方法访问环境变量:
@Bean
public SomeBean someBean() {
System.out.println("SOME_ENV_VAR was: ");
System.out.println(System.getenv("SOME_ENV_VAR"));
return new ServiceX(System.getenv("SOME_ENV_VAR"));
}在我的服务器上,这个输出:
SOME_ENV_VAR为: null
在我自己的机器上,当我使用mvn springboot运行springboot时,它会找到环境变量并很好地打印出来。我还测试了在服务器中,如果我在终端中运行env命令,就会找到/etc/environment中定义的环境变量。
那么,当springboot应用程序作为systemd服务运行时,如何获得springboot来检测环境变量呢?
我的springboot版本:2.3.0ServerOS: Ubuntu 18
我使用ansible systemd模块重新启动应用程序和服务:
---
- name: "Restart application"
systemd:
name: "{{ springboot_application_name }}.service"
enabled: yes
daemon-reload: yes
state: restarted发布于 2021-04-18 15:00:39
我不能对问题的Ansible部分发表评论,从spring的角度来看,应用程序可以从多个地方获取配置值,application.properties就是这样的一个位置,环境变量就是这样的另一个地方。更确切地说,是env。变量优先于属性文件中的值。有关指定配置的所有受支持方式列表,请考虑读取文档
现在,考虑到这一点,很明显,这个问题基本上与spring引导无关,它基本上归结为如何在systemd服务中指定环境变量。
那么,您可以尝试创建一个以*.conf结尾的文件
/etc/systemd/system/yourservice.service.d/yourenv.conf并将变量放在那里:
[Service]
Environment="FOO=foovalue"
Environment="BAR=barvalue"此外,我在“服务器故障”站点中找到了一个答案,它讨论了几乎所有可能的指定环境变量的方法。因此,请考虑阅读这条线
https://stackoverflow.com/questions/67148410
复制相似问题