【发布时间】:2021-04-18 12:16:08
【问题描述】:
我有一个作为 systemd 服务运行的 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 是: 空
在我自己的机器上本地,当我使用 mvn spring-boot:run 运行 springboot 时,它会找到环境变量并很好地打印出来。我也在服务器中测试过,如果我在终端运行 env 命令,会找到 /etc/environment 中定义的环境变量。
那么当springboot应用作为systemd服务运行时,如何让springboot检测环境变量呢?
我的springboot版本:2.3.0 服务器操作系统:Ubuntu 18
我正在使用 ansible systemd 模块重新启动应用程序和服务:
---
- name: "Restart application"
systemd:
name: "{{ springboot_application_name }}.service"
enabled: yes
daemon-reload: yes
state: restarted
【问题讨论】:
-
只是为了确定,你是不是通过
systemctl daemon-reload重新加载了systemctl守护进程,然后重启了spring服务?我像你一样使用 systemdEnvironmentFile然后在 application.properties 文件中使用环境变量值没有任何问题。 -
难道环境变量值只能在 application.properties 文件中使用?我使用 ansible systemd 模块重新加载服务。还有选项 daemon-reload,我已将其设置为值'yes'
标签: java spring spring-boot systemd