For Windows users seeking to create a GraalVM native image for a Linux environment, traditional approaches such as switching to Linux, dual booting, or using virtual machines can be cumbersome and inefficient. In this guide, we present a streamlined method leveraging Docker, enabling seamless development while retaining your Windows environment.
Traditional Methods and Their Challenges
Before exploring our Docker-based solution, let's review common methods and their limitations:
- Switching to Linux – This approach requires fully migrating to a Linux OS, causing loss of access to Windows-based applications.
- Dual Booting – Involves partitioning disk space for both Windows and Linux, requiring a reboot each time you switch between operating systems.
- Using a Virtual Machine (VM) – While providing a Linux environment within Windows, this method demands significant system resources and additional configuration.
A Modern Solution: Leveraging Docker
Using Docker, you can set up an isolated Linux environment within Windows, facilitating native image generation without the need for OS switching.
Step 1: Creating an Ubuntu-Based Docker Container
To establish an Ubuntu container with Git pre-installed, use the following Dockerfile:
# Use the official Ubuntu image as the base
FROM ubuntu:latest
# Set non-interactive mode to avoid interactive prompts
ENV DEBIAN_FRONTEND=noninteractive
# Update package lists and install Git and Wget, then clean up
RUN apt-get update && apt-get install -y \
git \
wget \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Set the default command
CMD ["/bin/bash"]
Step 2: Running the Container and Setting Up GraalVM
- Build and run the Docker container:
docker build -t ubuntu-graalvm . docker run -it ubuntu-graalvm
- Clone your project repository inside the container using Git.
- Download and extract GraalVM manually:
wget https://download.oracle.com/graalvm/23/latest/graalvm-jdk-23_linux-x64_bin.tar.gz tar -xvzf graalvm-jdk-23_linux-x64_bin.tar.gz
- Configure
JAVA_HOME
to point to the extracted GraalVM directory. - Build the native image. For a Maven Spring Boot project, use:
./mvnw -Pnative native:compile
Step 3: Transferring the Native Image to the Local Machine
Once the native image is successfully built, copy it from the container to your Windows system using:
docker cp <container_id>:/app/project/webfluxtest/target/webfluxtest C:\Users\YourUsername\Documents
Step 4: Packaging the Native Image in a Linux-Based Container
To deploy the native image within a Linux environment, use the following Dockerfile:
# Use a minimal Ubuntu base image
FROM ubuntu:latest
# Install necessary dependencies
RUN apt-get update && apt-get install -y libc6 && rm -rf /var/lib/apt/lists/*
# Set working directory
WORKDIR /app
# Copy the prebuilt native binary into the container
COPY webfluxtest /app/webfluxtest
EXPOSE 8080
# Set execution permissions
RUN chmod +x /app/webfluxtest
# Define the entrypoint
ENTRYPOINT ["/app/webfluxtest"]
Step 5: Building and Running the Final Container
- Build the Docker image:
docker build -t webfluxtest-native .
- Run the container:
docker run -p 8080:8080 webfluxtest-native
At this stage, your GraalVM native image is successfully running within a Linux-based Docker container, all while maintaining your Windows development environment.
Conclusion
By utilizing Docker, Windows users can efficiently build and deploy Linux-native GraalVM applications without the need for complex system reconfigurations. This approach enhances flexibility, optimizes workflow, and eliminates unnecessary overhead. Start leveraging Docker today for seamless native image development!