【问题标题】:Springboot does not find environment variables when run as a systemd serviceSpring Boot 在作为 systemd 服务运行时找不到环境变量
【发布时间】: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服务?我像你一样使用 systemd EnvironmentFile 然后在 application.properties 文件中使用环境变量值没有任何问题。
  • 难道环境变量值只能在 application.properties 文件中使用?我使用 ansible systemd 模块重新加载服务。还有选项 daemon-reload,我已将其设置为值'yes'

标签: java spring spring-boot systemd


【解决方案1】:

我无法评论问题的 Ansible 部分,从 Spring Boot 的角度来看,应用程序可以从多个地方获取配置值,application.properties 就是这样一个地方,环境变量只是另一个像这样的地方。更具体地说,环境。变量优先于属性文件中的值。有关指定配置的受支持方式的完整列表,请考虑阅读Documentation

现在,考虑到这一点,显然这个问题基本上与 Spring Boot 无关,它基本上归结为如何在 systemd 服务中指定环境变量

好吧,你可以尝试创建一个以*.conf结尾的文件:

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

并将变量放在那里:

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

我还在“serverfault”网站上找到了一个答案,该网站讨论了几乎所有可能的指定环境变量的方法。所以考虑阅读this thread

【讨论】:

  • 我的服务似乎位于 /etc/systemd/user/myapp.service。因此,如果我创建一个与 myapp.service 文件位于同一文件夹中的 *.conf 文件,它可能会起作用吗?
  • 我认为是这样,但您最好阅读最后一个链接,因为它是由 linux 人编写的(我主要是作为 Spring Boot 开发人员遇到这个问题)。我发现这是指定环境的方法之一。变量,但可能还有其他更适合您的需求。自己尝试,看看什么最适合你:)
  • 在 /etc/systemd/system 文件夹中创建文件夹和文件并使用您提到的样式指定变量似乎可以解决问题!非常感谢
猜你喜欢
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多