【问题标题】:Read docker env variable inside Spring application.yaml在 Spring application.yaml 中读取 docker env 变量
【发布时间】:2020-07-01 04:45:09
【问题描述】:

我正在我的 docker-compose.yaml 文件中设置一个环境变量,并希望在我的 Spring Boot 的 application.yaml 中使用该变量的值。有人告诉我做类似的事情

app:
  auth:
    tokenSecret: tokensecretvaluehere
    tokenExpirationMsec: 864000000
  oauth2:
    sso:
      url: ${SSO_URL}

(其中 SSO_URL 在我的 docker-compose.yaml 中定义)在我的 Spring application.yaml 中。但是,当我运行 docker-compose up --build 时,这会导致错误,因为它找不到该变量(错误类似于:无法解析值“${SSO_URL}”中的占位符 SSO_URL)。这是我的 docker-compose.yaml 的一个示例:

api:
    restart: always
    ports:
      - "8080:8080"
    links:
      - redis
      - db
    environment:
      - SERVER_SERVLET_SESSION_COOKIE_DOMAIN=localhost
      - SSO_URL=myvaluehere

我被要求不要在 Java 中使用 System.getenv 函数,而是像上面一样设置变量。从那里我只需使用 @Value 注释在我的 Java 代码中获取它,如下所示:

@Value("${app.oauth2.sso.url}")
private String ssoUrl;

这更多的是application.yaml:

heb:
  togglr:
    jwt:
      secret:
        id: 101
      session:
        seconds: 600
      tokenheader: X-TOGGLR-TOKEN
logging:
  level:
    com:
      heb: debug
    default: debug
  path: logs
server:
  error:
    whitelabel:
      enabled: false
  port: 8080
  servlet:
    context-path: /togglr-api
  use-forward-headers: true
spring:
  application:
    name: togglr_api
  freemarker:
    enabled: false
  groovy:
    template:
      enabled: false
  jmx:
    enabled: false
  main:
    banner-mode: 'off'
  thymeleaf:
    cache: false
  security:
    oauth2:
      client:
        registration:
          github:
            clientId:
            clientSecret:
            redirectUri: 
            scope:
              - user:email
              - read:user
app:
  auth:
    tokenSecret:
    tokenExpirationMsec: 864000000
  oauth2:
    sso:
      url: ${SSO_URL}

【问题讨论】:

    标签: spring-boot docker docker-compose


    【解决方案1】:

    一般来说,spring boot 应用程序能够读取 docker 容器中可访问的环境变量。它在documentation 中说明(请参阅文档开头列表中的第 10 项)。

    所以问题可能出在其他地方:

    1. 这可能是问题中的拼写错误,但如果您使用的是 application.yaml 而不是应用程序属性,那么您应该有类似的内容:
      sso:
        url: ${SSO_URL}
    
    1. 确保在启动 Spring Boot 应用程序之前,容器中的环境变量 SSO_URL 确实是可访问的。在 java 中(仅用于调试目的),您可以执行以下操作:
    @SpringBootApplication
    public class MyApp {
       public static void main(String [] args) {
              System.out.println(System.getenv("SSO_URL"));
              SpringApplication.run(MyApp.class);
       }
    }
    

    【讨论】:

    • 感谢您的回复。抱歉,是的,它是 application.yaml。我尝试按照您共享的方式对其进行格式化,但错误仍然存​​在。 Docker 的 env 变量似乎可以访问,因为我可以使用 System.getenv 将其打印出来。
    • 好的,那么您的application.yaml 看起来如何以及您如何尝试在 Java 代码中访问该属性 - 请您提供代码 sn-ps 吗?我可以推荐的一个想法是运行一个最小的可重现示例:从 start.spring.io 创建一个最小的应用程序 + 添加一些环境。运行时变量(甚至没有 docker) - 查看它是否在您的特定 Spring Boot 版本中存在问题,或者您在 java 中做错了什么
    • 在原帖中添加了额外的 sn-ps
    • 您可以尝试直接在您的 docker compose 文件中设置 app_oauth2_sso_url: myvaluehere abd 从 application.yml 中删除 ${SSO_URL} 部分
    • 我应该在它的 - ${SSO_URL} - 地方放什么?
    【解决方案2】:

    解决方案是不要在变量名中使用下划线字符。

    【讨论】:

    • 下划线是环境变量名称的有效符号。正如马克所说,问题可能出在其他地方。可能是您在重命名变量的同时更改了其他内容,并认为重命名有帮助。无论如何,我尝试按照您的建议仅重命名变量,但这没有帮助。
    • 来自 Spring Docs:“如果您使用环境变量而不是系统属性,大多数操作系统不允许使用句点分隔的键名,但您可以使用下划线代替(例如,SPRING_CONFIG_NAME”
    猜你喜欢
    • 2020-10-21
    • 2013-03-07
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多