Spring Boot doesn't read application properties when running in Docker container.
My application.yml
server:
port: 8080
context-path: /mail
custom:
greeting: Hello YML
Dockerfile
FROM java:8-jre
VOLUME /tmp
COPY ./mail.jar /app/mail.jar
RUN sh -c 'touch /app/mail.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app/mail.jar" ]
EXPOSE 8080
And a simple ApplicationController
@RestController
public class ApplicationController {
private final Environment environment;
@Autowired
public ApplicationController(Environment environment) {
this.environment = environment;
}
@RequestMapping(path = "/")
public Hello hello() {
final Hello hello = new Hello();
hello.setGreeting(environment.getProperty("custom.greeting"));
return hello;
}
}
I'm using IntelliJ Docker plugin that automatically map ports 8080(docker):18080(host) and makes app available on http://localhost:18080
Docker
Without Docker
context-path applied properly
custom.greeting property returns by controller properly
You have to add the application.properties file in the docker /app/ directory. Ur docker directory structure will be
app
-main.jar
-application.properties
You can do so by using ADD /ur/local/location/application.properties /app/application.properties
Then better write this command in your docker file
ENTRYPOINT ["java" ,"-Djava.security.egd=file:/dev/./urandom --spring.config.location=classpath:file:/app/application-properties","-jar","/app/main.jar"]
Your whole dockerFile should look like this:
FROM java:8-jre
VOLUME /tmp
COPY ./mail.jar /app/mail.jar
ADD /ur/local/location/application.properties /app/application.properties
ENTRYPOINT ["java" ,"-Djava.security.egd=file:/dev/./urandom --spring.config.location=classpath:file:/app/application-properties","-jar","/app/main.jar"]
EXPOSE 8080
Rename Application.yml to application.yml. It's with reference to the name used in the comments as Application.yml.
Application.yml works well with widows but breaks inside linux containers.
For the context path, you have to add the context path in the properties file. inside the application-default.properties:
server.servlet.contextPath=/myContext
Then build your project,
mvn clean install
Then create a docker image and run that image.