springboot在作为systemd服务运行时找不到环境变量

velaa5lx  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(590)

我有一个springboot应用程序,作为systemd服务运行。我的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=某个值。该值包含\u内容
在我的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"));
    }

在我的服务器上,这会打印出:
某些环境变量为:null
在我自己的机器上本地运行带有mvn spring的springboot时-boot:run it 找到环境变量并很好地打印出来。我还测试了在服务器中,如果在terminal中运行env命令,就会找到/etc/environment中定义的环境变量。
那么,当springboot应用程序作为systemd服务运行时,如何让springboot检测环境变量呢?
我的springboot版本:2.3.0服务器操作系统:ubuntu18
im使用ansible systemd模块重新启动应用程序和服务:

---
- name: "Restart application"
  systemd:
    name: "{{ springboot_application_name }}.service"
    enabled: yes
    daemon-reload: yes
    state: restarted
ukxgm1gy

ukxgm1gy1#

我不能评论这个问题的答案,从SpringBoot的观点来看,应用程序可以从多个地方获得配置值, application.properties 就是这样一个地方,环境变量就是这样一个地方。更具体地说,环境。变量优先于属性文件中的值。对于指定配置所支持的方法的完整列表,请考虑阅读文档
现在,考虑到这一点,显然这个问题基本上与spring boot无关,它基本上归结为如何在systemd服务中指定环境变量。
你可以试着创建一个以 *.conf :

/etc/systemd/system/yourservice.service.d/yourenv.conf

把变量放在那里:

[Service]
Environment="FOO=foovalue"
Environment="BAR=barvalue"

另外,我在“serverfault”站点中找到了一个答案,它讨论了几乎所有指定环境变量的可能方法。所以请考虑阅读这篇文章

相关问题