Приложение Spring boot, запущенное в docker, не может получить доступ к переменным среды

#docker #docker-compose #dockerfile

#docker #docker-compose #dockerfile

Вопрос:

Когда я запускаю приложение Spring boot в docker, я получаю исключение:

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

Без docker приложение запускается, если я устанавливаю переменную -Dmail.host в аргументы виртуальной машины.

В свойствах приложения из приложения Spring boot я определил некоторые свойства, подобные этому:

 spring.mail.host=${mail.host}
spring.mail.port=${mail.port}
spring.mail.username=${mail.from}
spring.mail.from=${mail.from}
spring.mail.password=${mail.password}
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.smtp.debug=DEBUG
spring.mail.smtp.socketFactory.port=${mail.port}
spring.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.smtp.socketFactory.fallback=false
  

Файл Docker выглядит следующим образом:

 VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar",
"-Dmail.from=*******",
"-Dmail.password=******",
"-Dmail.port=***",
"-Dmail.host=****",
"-Dencoder.secrete=*******]

  

Ответ №1:

Прежде всего: не записывайте переменные, связанные с окружением, в файл Docker, вместо этого используйте docker-compose на целевом сервере и предотвратите будущую головную боль 🙂

 # Dockerfile
FROM openjdk:8-jdk-alpine
ENV JAVA_OPTS="-Xmx${MEM_MAX} -Xms${MEM_INI} ...."
ADD ${JAR_FILE} /app.jar

EXPOSE 8080

ENTRYPOINT ["java","${JAVA_OPTS}","-jar","/app.jar"]
  

Затем укажите файл docker-compose.yml:

 # docker-compose.yml
version: "3.8"

services:
  application:
    image: your-image:lates
    environment:
      TZ: "Europe/Prague"
      JAVA_OPTS: >-
        -Dmail.from=*******
        -Dmail.password=******
        -Dmail.port=***"
        -Dmail.host=****"
        -Dencoder.secrete=*******
  

Ответ №2:

Я пробовал это, но приложение больше не может запускаться. При запуске контейнера в нем говорится: Error: Could not find or load main class ${JAVA_OPTS}

Ответ №3:

Я нашел лучший способ установки переменных среды:

 FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY /target/metal-investment-0.0.1.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
ENV MAIL_FROM=$METAL_INVESTMENT_MAIL_FROM
ENV MAIL_PASSWORD=$METAL_INVESTMENT_MAIL_PASSWORD
ENV MAIL_PORT=$METAL_INVESTMENT_MAIL_PORT
ENV MAIL_HOST=$METAL_INVESTMENT_MAIL_HOST
ENV ENCODER_SECRETE=$METAL_INVESTMENT_ENCODER_SECRETE

  

* Значения для переменных, подобных этому $METAL_INVESTMENT_MAIL_FROM, устанавливаются в переменных среды из операционной системы.