Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot access environment variables in Docker environment

I am trying to dockerize my spring boot project and use it in EC2 instance.

In application.properties I have following lines,

spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}

and I am reading SPRING_DATASOURCE_URL, SPRING_DATASOURCE_USERNAME and SPRING_DATASOURCE_PASSWORD from my environment.

I have following Dockerfile,

FROM openjdk:latest
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar", "-DSPRING_DATASOURCE_URL=${DATASOURCE_URL}", \
                           "-DSPRING_DATASOURCE_USERNAME=${DATASOURCE_USERNAME}", \
                           "-DSPRING_DATASOURCE_PASSWORD=${DATASOURCE_PASSWORD}", "/app.jar"]

EXPOSE 8080

When I try to run run the following command,

sudo docker run -p 80:8080 <image-repo> --env DATASOURCE_URL=<url> --env DATASOURCE_USERNAME=<username> --env DATASOURCE_PASSWORD=<password>

My application crashes because of the non-existing environment variables.

Also,

I have tried using docker-compose mentioned Spring boot app started in docker can not access environment variables link. It become much more complicated for me to debug.

TL;DR I want to achieve information hiding in my spring boot application. I want to use environment variables to hide my credentials to the database. However, my dockerized program is not having the environment variables that I want to have.

If you have any approaches other than this, I would be also happy to listen the way I can achieve information hiding. Thanks.

like image 601
Katie Avatar asked Apr 16 '26 16:04

Katie


1 Answers

You need to put options like docker run --env before the image name. If they're after the image name, Docker interprets them as the command to run; with the specific setup you have here, you'll see them as the arguments to your main() function.

sudo docker run \
  --env SPRING_DATASOURCE_URL=... \
  image-name
  # additional arguments here visible to main() function

I've spelled out SPRING_DATASOURCE_URL here. Spring already knows how to map environment variables to system properties. This means you can delete the lines from your application.properties file and the java -D options, so long as you do spell out the full Spring property name in the environment variable name.

like image 88
David Maze Avatar answered Apr 18 '26 10:04

David Maze



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!