【问题标题】:Pass Docker arguments to Spring boot properties将 Docker 参数传递给 Spring 引导属性
【发布时间】:2020-07-15 19:54:31
【问题描述】:

在我创建的一个本地项目中,用于测试将 Docker 参数传递给我的 Spring Boot application.properties 我在 application.properties 中:test.name=${name}

在应用程序中

@SpringBootApplication
public class RestServiceApplication {

    @Value("${test.name}")
    private String test;

    public static void main(String[] args) {
        SpringApplication.run(RestServiceApplication.class, args);
    }

    @Bean(name = "test")
    public String getTest() {
        return this.test;
    }
}

我的 Dockerfile:

FROM openjdk:8-jdk-alpine
ARG NAME
ENV TEST_NAME=${NAME}
RUN echo $TEST_NAME
ARG JAR_FILE=target/*.jar
RUN echo JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

使用sudo docker build -t gs-rest-service --build-arg NAME=Alex . 构建它这在本地可以正常工作

现在在另一个项目上我的application.properties:

bulk.api.username=${BULK_USERNAME}
bulk.api.password=${BULK_PASSWORD}

还有我的 Dockerfile:

FROM maven:3.6.0-jdk-8 AS build

ARG ARTIFACTORY_USER
ARG ARTIFACTORY_PASSWORD

WORKDIR /build
COPY . .

RUN mvn -s settings.xml clean package

ARG BULK_USERNAME
ARG BULK_PASSWORD
ENV BULK_API_USERNAME=${BULK_USERNAME}
ENV BULK_API_PASSWORD=${BULK_PASSWORD}
RUN echo $BULK_API_PASSWORD

FROM openjdk:8-jre-alpine

WORKDIR /opt/cd-graph-import
COPY --from=build /build/target/abc-svc.jar .

ENTRYPOINT ["java", "-jar", "abc-svc.jar"]

我的春季靴课:

@SpringBootApplication
public class SpringBootApplication {

    @Value("${bulk.api.username}")
    private String bulkApiUsername;

    @Value("${bulk.api.password}")
    private String bulkApiPassword;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplateBuilder().basicAuthentication(bulkApiUsername, bulkApiPassword).build();
    }

    @Bean(name = "bulkApiUrl")
    public String getBulkApiUrl() {
        return this.bulkApiUrl;
    }
}

当它在 gitlab 中运行时:

docker build -t $SERVICE_IMAGE --build-arg ARTIFACTORY_USER=$ARTIFACTORY_USER --build-arg ARTIFACTORY_PASSWORD=$ARTIFACTORY_PASSWORD --build-arg BULK_USERNAME=$BULKAPI_USERNAME --build-arg BULK_PASSWORD=$BULKAPI_PASSWORD .

我看到 $BULK_API_PASSWORD 设置正确,但是在运行应用程序时出现错误:`Error Creating bean with name

'someApplication': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'BULK_USERNAME' in value "${BULK_USERNAME}"

我错过了什么?

【问题讨论】:

  • 只是一个细微的差别,但在工作情况下它是${name}(小写!)..而非工作它是......大写! (请尝试这个简单的修复)..in application.properties 然后甚至可能不是${FOO_BAR},而是${foo.bar}。
  • 不是这样的。我还替换了工作示例中的占位符,它仍然可以正常工作。

标签: spring-boot docker maven


【解决方案1】:

根据 springboot application properties docs,您可以通过环境变量设置应用程序属性。您应该使用与属性名称相同的 env 变量,但如果您使用 env 变量,建议使用 '_' 而不是 '.'。例如,如果要设置 test.name,则必须设置 TEST_NAME env 参数。

在第一个示例中,您在 docker 文件中设置了 TEST_NAME env 参数。当您的应用程序启动时,spring 从 env 变量中获取属性(spring 获取 TEST_NAME,而不是 NAME 变量)并传递给应用程序,它会替换您的默认值“${name}”。请注意,spring 不会注入 NAME 变量,而是将属性 test.name 替换为 env 变量中的值。

在第二种情况下,您没有设置 BULK_API_USERNAME 和 BULK_API_PASSWORD env 属性,并且 spring 不会替换默认值并使用 ${API_USERNAME} 和 ${API_PASSWORD} 作为属性值。您应该设置 BULK_API_USERNAME 和 BULK_API_PASSWORD 以将您的值传递给应用程序。

并且还将application.properties中的属性值留空。 'bulk.api.username=' 和 'bulk.api.password='

【讨论】:

  • 是的,抱歉,这是一个错误,因为我正在重命名这些字段。我现在更改了它们并将其更改为您建议的内容,但正如上面更新的那样,我仍然得到'Could not resolve placeholder 'BULK_USERNAME' in value "${BULK_USERNAME}"
  • 您能说明如何在您的应用中注入价值吗?你使用@Variable 吗?如果是,您使用什么论据?
  • 我添加了它。我和其他人一样使用@Value
  • 你能显示你传递给注解@Value的值吗?
  • 好的,让我们尝试将application.properties 中的属性值留空。 'bulk.api.username=' 和 'bulk.api.password='
猜你喜欢
  • 1970-01-01
  • 2018-02-05
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多