Friday, February 28, 2025

Building a GraalVM Native Image for Linux on Windows Using Docker


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:

  1. Switching to Linux – This approach requires fully migrating to a Linux OS, causing loss of access to Windows-based applications.
  2. Dual Booting – Involves partitioning disk space for both Windows and Linux, requiring a reboot each time you switch between operating systems.
  3. 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

  1. Build and run the Docker container:
    docker build -t ubuntu-graalvm . docker run -it ubuntu-graalvm
  2. Clone your project repository inside the container using Git.
  3. 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
  4. Configure JAVA_HOME to point to the extracted GraalVM directory.
  5. 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

  1. Build the Docker image:
    docker build -t webfluxtest-native .
    
  2. 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!


No comments: