运行作为systemd服务时springboot找不到环境变量
Springboot does not find environment variables when run as a systemd service
我有一个 spring 启动应用程序,我 运行 作为 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=SOME_VALUE.THAT_CONTAINS_STUFF
在我的 spring 启动应用程序中,我尝试使用 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 was:
null
在我自己的机器上,当我 运行 spring 使用 mvn spring-boot:运行 引导时它找到环境变量并很好地打印出来。我还在服务器中测试过,如果我在终端中 运行 env 命令,则会找到 /etc/environment 中定义的环境变量。
那么当 springboot 应用程序 运行 作为 systemd 服务时,如何让 springboot 检测环境变量?
我的spring引导版本:2.3.0
服务器 OS:Ubuntu 18
我正在使用 ansible systemd 模块重新启动应用程序和服务:
---
- name: "Restart application"
systemd:
name: "{{ springboot_application_name }}.service"
enabled: yes
daemon-reload: yes
state: restarted
我无法评论问题的 Ansible 部分,从 spring 引导的角度来看,应用程序可以从多个位置获取配置值,application.properties
是一个这样一个地方,环境变量只是另一个这样的地方。更具体地说,环境。变量优先于 属性 文件中的值。有关指定配置的受支持方式的完整列表,请考虑阅读 Documentation
现在,考虑到这一点,显然这个问题基本上与 spring 引导无关,它基本上归结为 如何在 systemd 服务中指定环境变量.
嗯,您可以尝试创建一个以 *.conf
:
结尾的文件
/etc/systemd/system/yourservice.service.d/yourenv.conf
并将变量放在那里:
[Service]
Environment="FOO=foovalue"
Environment="BAR=barvalue"
我还在“serverfault”站点找到了一个答案,该站点讨论了几乎所有可能的指定环境变量的方法。所以考虑阅读 this thread
我有一个 spring 启动应用程序,我 运行 作为 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=SOME_VALUE.THAT_CONTAINS_STUFF
在我的 spring 启动应用程序中,我尝试使用 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 was: null
在我自己的机器上,当我 运行 spring 使用 mvn spring-boot:运行 引导时它找到环境变量并很好地打印出来。我还在服务器中测试过,如果我在终端中 运行 env 命令,则会找到 /etc/environment 中定义的环境变量。
那么当 springboot 应用程序 运行 作为 systemd 服务时,如何让 springboot 检测环境变量?
我的spring引导版本:2.3.0 服务器 OS:Ubuntu 18
我正在使用 ansible systemd 模块重新启动应用程序和服务:
---
- name: "Restart application"
systemd:
name: "{{ springboot_application_name }}.service"
enabled: yes
daemon-reload: yes
state: restarted
我无法评论问题的 Ansible 部分,从 spring 引导的角度来看,应用程序可以从多个位置获取配置值,application.properties
是一个这样一个地方,环境变量只是另一个这样的地方。更具体地说,环境。变量优先于 属性 文件中的值。有关指定配置的受支持方式的完整列表,请考虑阅读 Documentation
现在,考虑到这一点,显然这个问题基本上与 spring 引导无关,它基本上归结为 如何在 systemd 服务中指定环境变量.
嗯,您可以尝试创建一个以 *.conf
:
/etc/systemd/system/yourservice.service.d/yourenv.conf
并将变量放在那里:
[Service]
Environment="FOO=foovalue"
Environment="BAR=barvalue"
我还在“serverfault”站点找到了一个答案,该站点讨论了几乎所有可能的指定环境变量的方法。所以考虑阅读 this thread