Reputation: 175
I am trying to run a spring-boot app in docker but when I try and parse environment variables in the dockerfile entrypoint I am getting the following error:
Unable to open JDBC Connection for DDL execution
My dockerfile looks like this
FROM maven:3.6-jdk-8
COPY . /usr/src/api
WORKDIR /usr/src/api
ENV SPRING_URL ${SPRING_DATASOURCE_URL}
ENV SPRING_USERNAME ${SPRING_DATASOURCE_USERNAME}
ENV SPRING_PASSWORD ${SPRING_DATASOURCE_PASSWORD}
RUN mvn install:install-file \
-Dfile=.mvn/wrapper/maven-wrapper.jar \
-Dversion=1.0 \
-Dpackaging=jar \
-DgeneratePom=true \
-DSPRING_DATASOURCE_URL=SPRING_URL \
-DSPRING_DATASOURCE_USERNAME=SPRING_USERNAME \
-DSPRING_DATASOURCE_PASSWORD=SPRING_PASSWORD
ENTRYPOINT mvn -DSPRING_DATASOURCE_URL=SPRING_URL -DSPRING_DATASOURCE_USERNAME=SPRING_USERNAME -DSPRING_DATASOURCE_PASSWORD=SPRING_PASSWORD spring-boot:run
The env variables are coming from the docker-compose file. I am running
docker-compose build
, which builds successfully (including the tests being passed) and docker-compose -p 0.0.0.0:8080:8080 run api
which fails with the above error.
My docker-compose.yml looks like this:
version: '3'
services:
api:
image: test/api:1.0
build:
context: .
dockerfile: Dockerfile
environment:
- SPRING_DATASOURCE_URL=${SPRING_DATASOURCE_URL}
- SPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME}
- SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
The problem is in how I am parsing env variables to the entrypoint. On the mvn install, it seems to be working fine, but not on the spring-boot:run. Is the shell form of entrypoint te right command and how should I be parsing the variables?
Upvotes: 1
Views: 1861
Reputation: 175
I followed this https://spring.io/blog/2018/11/08/spring-boot-in-a-container to dockerize the app with my application.properties looking like this:
spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username = ${SPRING_DATASOURCE_USERNAME}
spring.datasource.password = ${SPRING_DATASOURCE_PASSWORD}
Then my docker-compose.yml remained the same and my Dockerfile looks like this:
FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG DEPENDENCY=target/dependency
ARG SPRING_DATASOURCE_URL
ARG SPRING_DATASOURCE_USERNAME
ARG SPRING_DATASOURCE_PASSWORD
ENV SPRING_DATASOURCE_URL ${SPRING_DATASOURCE_URL}
ENV SPRING_DATASOURCE_USERNAME ${SPRING_DATASOURCE_USERNAME}
ENV SPRING_DATASOURCE_PASSWORD ${SPRING_DATASOURCE_PASSWORD}
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
EXPOSE 8080
ENTRYPOINT ["java","- cp","app:app/lib/*","test.ApiApplication"]
I found this page very useful in explained ARGs and ENVs in dockerfile https://vsupalov.com/docker-arg-env-variable-guide/
Also to make my original dockerization approach to work my application.properties and docker-compose remained the same and my dockerfile was like this:
FROM maven:3.6-jdk-8
COPY . /usr/src/api
WORKDIR /usr/src/api
ARG SPRING_DATASOURCE_URL
ARG SPRING_DATASOURCE_USERNAME
ARG SPRING_DATASOURCE_PASSWORD
RUN mvn install:install-file \
-Dfile=.mvn/wrapper/maven-wrapper.jar \
-DgroupId=test.ApiApplication \
-DartifactId=api \
-Dversion=1.0 \
-Dpackaging=jar \
-DgeneratePom=true \
-DSPRING_DATASOURCE_URL=${SPRING_DATASOURCE_URL} \
-DSPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME} \
-DSPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
ENV SPRING_DATASOURCE_URL ${SPRING_DATASOURCE_URL}
ENV SPRING_DATASOURCE_USERNAME ${SPRING_DATASOURCE_USERNAME}
ENV SPRING_DATASOURCE_PASSWORD ${SPRING_DATASOURCE_PASSWORD}
EXPOSE 8080
ENTRYPOINT mvn -DSPRING_DATASOURCE_URL=${SPRING_DATASOURCE_URL} - DSPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME} - DSPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD} spring-boot:run
Upvotes: 1