spring-boot - 在 Spring application.yaml 中读取 docker env 变量

标签 spring-boot docker docker-compose

我在我的 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 容器中可访问的环境变量。它在 documentation 中说明(请参阅文档开头列表中的第 10 项)。

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

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

    关于spring-boot - 在 Spring application.yaml 中读取 docker env 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60767510/

    相关文章:

    java - 使用计时器进行 ScheduleAtFixedRate

    java - 更改数据库设计以改进 Spring Data JPA 软删除和查询身份验证

    amazon-web-services - 如何将带参数的命名参数传递给 aws 批处理?

    docker - VSTS docker撰写任务

    docker - docker-compose:为非docker服务器名称声明别名

    java - 由于缺少 EmbeddedServletContainerFactory bean,Spring Boot 无法启动 EmbeddedWebApplicationContext

    java - Spring 声明式事务中的传播(选择正确)问题

    node.js - PM2,以代码 0 退出(启动时重新启动)

    java - 如何减少 Docker 中的 Spring Boot 应用程序内存使用量?

    postgresql - 如何在 Docker 中的 PostgreSQL 镜像中构建外部数据目录?