Spring Boot: live reload with Docker




When we develop web applications with Spring Boot, we have to restart the server to pick up all our changes. This kills productivity. Spring Boot Developers Tools provides solutions to automatically pick up changes without a complete server restart.

The Problem With Server Restarts

When we develop our applications (web or RESTful API), we want to be able to test our changes quickly. Typically, in the Java world, we need to restart the server to pick up changes.

That's where Spring Boot Developer Tools comes into the picture.

Adding Spring Boot Developer Tools to your project is very simple. First, add this dependency to your Spring Boot Project gradle.build:

compile 'org.springframework.boot:spring-boot-devtools'


Create a file in the root of the project, called 'Dockerfile', I've used this Dockerfile's template:

FROM openjdk:11-jre
CMD ["gradle"]
ENV GRADLE_HOME /opt/gradle
ARG GRADLE_DOWNLOAD_SHA256=1c59a17a054e9c82f0dd881871c9646e943ec4c71dd52ebc6137d17f82337436
RUN set -o errexit -o nounset \
 && echo "Downloading Gradle" \
 && wget --no-verbose --output-document=gradle.zip "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" \
 && echo "Checking download hash" \
 && echo "${GRADLE_DOWNLOAD_SHA256} *gradle.zip" | sha256sum --check - \
    && echo "Installing Gradle" \
    && unzip gradle.zip \
    && rm gradle.zip \
    && mv "gradle-${GRADLE_VERSION}" "${GRADLE_HOME}/" \
    && ln --symbolic "${GRADLE_HOME}/bin/gradle" /usr/bin/gradle \
 && echo "Adding gradle user and group" \
 && groupadd --system --gid 1000 gradle \
 && useradd --system --gid gradle --uid 1000 --shell /bin/bash --create-home gradle \
 && mkdir /home/gradle/.gradle \
 && chown --recursive gradle:gradle /home/gradle \
 && echo "Symlinking root Gradle cache to gradle Gradle cache" \
 && ln -s /home/gradle/.gradle /root/.gradle
USER gradle
VOLUME "/home/gradle/.gradle"
WORKDIR /home/gradle
RUN set -o errexit -o nounset \
 && echo "Testing Gradle installation" \
 && gradle --version

Info: this is the official Gradle Docker Hub

Create a file in the root of the project, called 'docker-compose.yml':

version: '3.3'
context: ./
dockerfile: Dockerfile
 volumes: - ./:/app
working_dir: /app
command: sh run.sh
ports: - 8080:8080

And create another file in the root of the project, called 'run.sh':

gradle --stop
gradle build --continuous --quiet &
gradle bootRun

Build and Run!

docker-compose build
docker-compose up