SpringBoot项目,application.yml中的环境变量始终为空

时间:2019-06-14 13:52:02

标签: maven spring-boot docker-compose environment-variables

我正在尝试运行一个运行docker-compose的SpringBoot项目。我从df['IP']=df['A'].str.findall(r'(?:\d{1,3}\.)+(?:\d{1,3})').str[0] df Out[246]: A IP 0 linux_test (dns-1-intern) 10.10.10.250, Berlin_DC 10.10.10.250

开始了其依赖项(Redis,MongoDB和RabbitMQ)

并且我正在构建项目并使用以下命令运行它 docker-compose up

我一直遇到这些错误:

mvn clean package -DskipTests && mvn spring-boot:run

Error processing condition on org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2RestOp erationsConfiguration$RequestScopedConfiguration

在docker-compose文件中,环境变量的值在环境部分中定义。

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'OAUTH_CLIENTID' in value "${OAUTH_CLIENTID}"

这是application.yml的样子:

 environment:
      - RABBIT_HOST=rabbitstomp
      - RABBIT_USER=guest
      - RABBIT_PASS=user
      - MONGO_HOST=mongodb://localhost:27017
      - OAUTH_CLIENTID=nz-kek
      - OAUTH_CLIENT_SECRET=DzXZxeOZOJHFZIUhObSpsne
      - SSO_HOST=https://webweb.com
      - CORS_HOSTS=HOST1,HOST2
      - SES_HOST=ses
      - SES_PORT=6000
      - REDIS_HOST=localhost
      - REDIS_PORT=6379 

因此,当在没有docker-compose的情况下运行项目时,我应该将这些值放入application.yml吗?

我也尝试过 spring.data.mongodb: database: ${DB_NAME} #notificationdb uri: ${MONGO_HOST} security: oauth2: resource: jwk: key-set-uri: ${auth-server:${SSO_HOST}}/keys token-info-uri: ${auth-server:${SSO_HOST}}/userinfo client: client-id: ${OAUTH_CLIENTID} client-secret: ${OAUTH_CLIENT_SECRET}` ,但是我不确定使用mvn spring-boot:run -Dspring-boot.run.arguments=--path.to.value=value1这样的变量的路径应该如何

2 个答案:

答案 0 :(得分:1)

Spring支持通过PlaceholderConfigurerSupport在配置中提供默认值。默认值为:之后的值。对于您的情况,您应该写:

client-id: ${OAUTH_CLIENTID:yourDevelopmentDefaultClientID}

如果使用@Value批注来注入值,则SpEL支持使用类型为#{someExpression}的表达式来处理更复杂的情况。

更新:

就您而言,我相信您正在颠倒变量的位置。正确的应该是:

key-set-uri: ${SSO_HOST:auth-server}/keys

这是什么意思:首先,它将尝试使用SSO_HOST环境变量,该变量通过docker-compose提供给容器。如果没有将此变量提供给进程,Spring将使用auth-server作为服务器的地址。在我看来,此地址仅在docker-compose网络内部可见,因此,如果您在此网络外部运行应用程序,则auth-server地址将不可见。您知道认证服务器在哪里吗?是另一个Docker容器吗?它在本地主机上运行吗?

一些有趣的参考:https://www.baeldung.com/spring-value-defaults

答案 1 :(得分:0)

在docker中传递环境变量作为对象而不是列表:

environment:
  RABBIT_HOST: rabbitstomp
  RABBIT_USER: guest
  RABBIT_PASS: user
  MONGO_HOST: mongodb://localhost:27017
  OAUTH_CLIENTID: nz-kek
  OAUTH_CLIENT_SECRET: DzXZxeOZOJHFZIUhObSpsne
  SSO_HOST: https://webweb.com
  CORS_HOSTS: HOST1,HOST2
  SES_HOST: ses
  SES_PORT: 6000
  REDIS_HOST: localhost
  REDIS_PORT: 6379`