#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, устанавливаются в переменных среды из операционной системы.