Передайте Docker аргументы в свойства загрузки Spring - PullRequest
0 голосов
/ 03 апреля 2020

В локальном проекте, который я создал для проверки передачи Docker аргументов моей весенней загрузке 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 установлен правильно, но при запуске приложения я получаю ошибку: `Ошибка создания бина с именем

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

Чего мне не хватает?

1 Ответ

2 голосов
/ 03 апреля 2020

Согласно документации по свойствам загрузочного приложения spring , вы можете устанавливать свойства приложения с помощью переменной среды. Вам следует создать переменную env с тем же именем, что и имя свойства, но если вы используете переменную env, рекомендуется использовать «_» вместо «.». Например, если вы хотите установить test.name, вам нужно установить TEST_NAME аргумент env.

В первом примере вы установите параметр TEST_NAME env в файле docker. Когда ваше приложение запускается, spring получает свойство из переменной env (spring получает TEST_NAME, а не NAME variable) и передает его в приложение, которое заменяет значение по умолчанию «$ {name}». Обратите внимание, что здесь пружина не вводит переменную 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 =' ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...