Minimal Docker image with GraalVM + Maven installed via SDKMAN!. Use it to build JVM apps and GraalVM native images without installing toolchains locally.
Images are automatically published on Docker Hub and GHCR when a git tag is pushed.
- GraalVM: 25-graalce
- Maven: 3.9.11
- Architectures: linux/amd64,linux/arm64
- Registries:
- Docker Hub: softinstigate/graalvm-maven
- GitHub Container Registry: ghcr.io/softinstigate/graalvm-maven
 
- Docker Hub: 
- Useful tags:
- latest(tracks the most recent release)
- 25-graalce(current main)
- Historical examples: 24.0.2-graalce,22.0.2-graalce,21.0.2-graalce
 
Browse tags on:
- Docker Hub: https://hub.docker.com/r/softinstigate/graalvm-maven/tags
- GHCR: https://github.com/SoftInstigate/graalvm-maven-docker/pkgs/container/graalvm-maven
# Docker Hub
docker pull softinstigate/graalvm-maven:25-graalce
# Or GHCR
docker pull ghcr.io/softinstigate/graalvm-maven:25-graalceThe default ENTRYPOINT is mvn. The working directory is /opt/app.
# Print Maven + Java versions
docker run --rm softinstigate/graalvm-maven --version
# Build a Maven project in the current directory
docker run -it --rm \
    -v "$PWD":/opt/app \
    -v "$HOME"/.m2:/root/.m2 \
    softinstigate/graalvm-maven \
    clean packageMounting
~/.m2speeds up builds by reusing your local Maven cache.
Use the GraalVM Native Build Tools (Maven plugin) in your project. Then run:
# Show native plugin help
docker run -it --rm -v "$PWD":/opt/app softinstigate/graalvm-maven native:help
# Typical native build (adjust for your project)
docker run -it --rm \
    -v "$PWD":/opt/app \
    -v "$HOME"/.m2:/root/.m2 \
    softinstigate/graalvm-maven \
    -Pnative -DskipTests native:compile# Build the image locally (no cache)
./bin/build.sh
# Test the image
docker run -it --rm softinstigate/graalvm-maven --version
# Optional: push :latest manually (CI handles official releases)
./bin/push.sh- GitHub Actions workflow: .github/workflows/deploy-image.yml
- Trigger: push of any git tag
- Output: multi-arch images pushed to Docker Hub and GHCR with:
- latestand the exact git tag name
 
- Maintainer flow to release a new base version:
- Update ARG JAVA_VERSIONandARG MAVEN_VERSIONinDockerfile
- Update the versions in this README
- Commit and push, then create and push a git tag (e.g. 25-graalce)
 
- Update 
- Entrypoint script: bin/entrypoint.sh- Sources /root/.bashrcto activate SDKMAN! before executing Maven
- Executes mvn "$@"
 
- Sources 
- SDKMAN! config ensures non-interactive installs and stable tool versions:
- sdkman_auto_answer=true
- sdkman_auto_selfupdate=false
- sdkman_insecure_ssl=true
 
- 
Maven not found when overriding entrypoint: - If you replace the entrypoint with a shell, run source ~/.bashrcbefore usingmvn.
 docker run -it --rm --entrypoint bash softinstigate/graalvm-maven source ~/.bashrc && mvn -v 
- If you replace the entrypoint with a shell, run 
- 
Slow builds or dependency downloads: - Ensure you mount your local Maven cache: -v "$HOME"/.m2:/root/.m2
 
- Ensure you mount your local Maven cache: 
- 
Verify SDKMAN!/Java/Maven inside the container: docker run -it --rm --entrypoint bash softinstigate/graalvm-maven -lc \ 'source ~/.bashrc; sdk current; java -version; mvn -version'
This repository is licensed under the Apache License 2.0.