sebastiandaschner blog


Quarkus remote dev in Docker containers (Update)

thursday, december 10, 2020

In an earlier video, I shared how to run the Quarkus remote-dev mode in Docker containers, which is very helpful for local and remote development environments. Since Quarkus version 1.6, however, the way how we execute the remote dev mode has changed.

Assuming, we’d like to have the same setup like in the mentioned video.

What’s new is that we don’t have to start the remote Quarkus instance with Maven, but instead use a different packaging mode and some System variables.

You can check out the documentation how these different package modes are specified.

I want to continue running my production application in the same way as before, and only the remote-dev-enabled mode will be built differently:

# for remote-dev-mode
mvn clean package -Dquarkus.package.type=mutable-jar
docker build -f Dockerfile.dev -t tmp-builder .

docker run --rm \
  --name coffee-shop \
  -p 8080:8080 \
  -p 5005:5005 \
  tmp-builder

Our Quarkus app will be packaged as mutable-jar application and bundled in a Docker image. Our local Docker container will be started with published HTTP port 8080 and debug port 5005.

The Dockerfile.dev file looks now as follows:

# Dockerfile for remote-dev-mode
FROM adoptopenjdk/openjdk14-openj9:x86_64-alpine-jre-14_36.1_openj9-0.19.0
RUN apk add curl

ENV QUARKUS_LAUNCH_DEVMODE=true \
    JAVA_ENABLE_DEBUG=true

COPY target/quarkus-app/lib/ /deployments/lib/
COPY target/quarkus-app/*.jar /deployments/
COPY target/quarkus-app/app/ /deployments/app/
COPY target/quarkus-app/quarkus/ /deployments/quarkus/

CMD ["java", "-jar", \
  "-Dquarkus.http.host=0.0.0.0", \
  "-Djava.util.logging.manager=org.jboss.logmanager.LogManager", \
  "-Dquarkus.package.type=mutable-jar", \
  "-Dquarkus.live-reload.password=123", \
  "/deployments/quarkus-run.jar"]

The application will be started in (remote) dev mode, once the QUARKUS_LAUNCH_DEVMODE environment variable is set to true. Additionally, we define JAVA_ENABLE_DEBUG to get the same result like previously, namely that we can remote-debug our application via port 5005.

Then, from a new terminal we start the Maven remote-dev goal:

mvn quarkus:remote-dev -Ddebug=false \
  -Dquarkus.package.type=mutable-jar \
  -Dquarkus.live-reload.url=http://localhost:8080 \
  -Dquarkus.live-reload.password=123

The local Maven instance should not listen to a debug port, and we provide the same connection and packaging information.

Now, we can connect to localhost:8080, debug via localhost:5005, and see our source code changes being reflected in the running Quarkus application, again.

To get the full code example, see the updated coffee-shop project on GitHub, especially the systemtest-run-dev-env.sh script.

 

Found the post useful? Subscribe to my newsletter for more free content, tips and tricks on IT & Java:

All opinions are my own and do not reflect those of my employer or colleagues.