【问题标题】:SpringBoot environment is null in dockerdocker中的SpringBoot环境为空
【发布时间】:2019-02-11 03:11:15
【问题描述】:

我在 application.yml 中有一个带有 gradle 和一些环境变量的 springboot java 应用程序:

spring:
  profiles: development
server:
  port: 3100
database:
  connectionString: mongodb://localhost:27017

---

spring:
  profiles: production
server:
  port: 80
database:
  connectionString: prodCS

我的码头文件:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Dspring.profiles.active=development","-jar","/app.jar"]

我正在尝试在本地运行 docker,但我的环境返回 null 属性

@Configuration
public class MongoUtilities {
  @Resource
  public Environment env;
  private static String mongoUri;

  @Bean
  public static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
  }

  @Bean
  public boolean ReadConnectionString() {
    mongoUri = env.getProperty("database.connectionString");
    System.out.println("Loaded connection Uri : " + mongoUri);
    return true;
  }
}

我之前遇到过环境变量为空的问题,但我设法修复了它。它现在可以在带有标志 --spring.profiles.active=development 的 intellij 中完美运行

我正在使用gradlew build docker 构建并使用docker run springio/my-app 启动docker

这一切都很标准,我只是这方面的初学者。

有什么想法吗?

【问题讨论】:

  • 尝试将您的 docker run 命令更改为 docker run -e "SPRING_PROFILES_ACTIVE=development" springio/my-app
  • 试过了,它实现了与 -Dspring.profiles.active=development 相同的目标,所以没有任何改变。我的环境有价值,但我的问题是每次我写 env.getProperty() 我都会得到空值

标签: java docker spring-boot intellij-idea


【解决方案1】:

有两种方法,即

  • 在 Dockerfile 中传递 Spring Profile

    ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=dev","-jar","/rest-api.jar"]
    
  • 在 Docker 运行命令中传递 Spring Profile

     docker run -d -p 8080:8080 -e "SPRING_PROFILES_ACTIVE=dev" --name rest-api dockerImage:latest
    
  • 在 DockerCompose 中传递 Spring 配置文件

     rest-api:
     image: rest-api:0.0.1
     ports:
       - "8080:8080" 
     environment:
       - "SPRING_PROFILES_ACTIVE=dev"
    

我在detail over here写过,你如何实现以上3种方法。

【讨论】:

  • 这不能回答我的问题。我已经可以设置活动配置文件了。问题是所有配置文件中都没有任何属性
  • 对不起,我错过了你的问题。您的 application.yaml 是否仅在 src/main/resources 文件夹中?即使出于某种原因,如果配置文件属性没有被拾取,那么默认属性会被拾取吗?
  • Abhi application.yml 在我的根目录中,但问题是 docker 没有部署它。我设法修复它并为其他人写了一个答案
【解决方案2】:

好的,我已经通过将我的 application.yml 添加到 build.gradle 中的 docker 来修复它:

docker {
  dependsOn build
  name "${project.group}/${bootJar.baseName}"
  files bootJar.archivePath, 'application.yml'
  buildArgs(['JAR_FILE': "${bootJar.archiveName}"])
}

然后我必须使用 dockerfile 将 application.yml 复制到映像中

COPY application.yml application.yml

然后我将 spring 的配置设置为我的 application.yml

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Dspring.config.location=application.yml", "-jar","/app.jar"]

【讨论】:

    猜你喜欢
    • 2019-10-29
    • 2019-10-14
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多