A simple Gradle plugin to build very simple Spring Boot application Docker images.
Just Docker, Java, and your Spring Boot application
More specifically, this plugin automates the best practices described in the Spring Boot Container Images documentation by
- Hooking into the
bootJartask of the Spring Boot Gradle Plugin - Extracting the application layers
- Generating a Dockerfile
- Performing the docker build
- Pushing to a registry
Some additional features include
- Optional support for non-layered images that just
java -jar application.jar - Easy to integrate with Skaffold a custom build stage
The Docker client needs to be installed locally with access to a Docker daemon. If pushing the image, docker login needs to be performed for the desired image registry.
buildSimpleBootImage- NOTE if using buildx, the default, pushing to a registry can be optimized into this same task by setting the extension property
simpleBootImage.pushtotrue.
- NOTE if using buildx, the default, pushing to a registry can be optimized into this same task by setting the extension property
pushSimpleBootImage
This plugin adds an extension named springBootImage; however, the defaults use a combination of gradle properties and environment variables to adapt easily to CI/CD and Skaffold builds.
The properties of the extension are:
| Name | Description | Default |
|---|---|---|
| baseImage | Property imageBaseor "eclipse-temurin:17" |
|
| cacheFrom | Property imageCacheFrom |
|
| cacheTo | Property imageCacheTo |
|
| exportPort | 8080 |
|
| fullyQualifiedImageName | Environment variable IMAGEor uses imageRepo, imageName, and tags |
|
| imageName | Name part of {repo}/{name}:{tag} |
Property imageNameor project.name |
| imageRepo | Repo part of {repo}/{name}:{tag} |
Property imageRepo |
| layered | Property imageLayeredor true |
|
| platforms | os/arch list supported by buildx |
Default for builder |
| pullForBuild | Property imagePullor false |
|
| push | Property imagePushor Environment variable PUSH_IMAGEor false |
|
| tags | Tag part of {repo}/{name}:{tag} |
["latest", project.version] |
| useBuildx | true |
|
| labels.description | project.description |
|
| labels.extra | Map of extra labels to apply | [:] |
| labels.revision | Property git.commit |
|
| labels.sourceUrl | If environment variable GITHUB_REPOSITORY, then https://github.com/${GITHUB_REPOSITORY} |
|
| labels.title | project.name |
|
| labels.version | Property imageVersionor project.version |
skaffold.yaml:
# nonk8s
apiVersion: skaffold/v3
kind: Config
metadata:
name: app-dev
build:
artifacts:
- image: app-dev
custom:
buildCommand: ./gradlew pushSimpleBootImage
dependencies:
paths:
- build.gradle
- src/main/java
- src/main/resources
profiles:
- name: windows
build:
artifacts:
- image: app-dev
custom:
# override this since Windows needs backslash'y paths
buildCommand: .\gradlew pushSimpleBootImage
manifests:
rawYaml:
- k8s/*.ymlIn build.gradle, you should also add the following to hook into the test flag.
test.onlyIf { !System.getenv('SKIP_TESTS') }Single platform:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to image registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Gradle build and push
uses: gradle/gradle-build-action@v2
with:
arguments: |
-PimageRepo=ghcr.io/${{ github.actor }}
-PimagePush=true
-PimageCacheFrom=type=gha
-PimageCacheTo=type=gha,mode=max
buildSimpleBootImageand multi-platform using buildx:
steps:
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v2.0.0
- name: Login to image registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Gradle build and push
uses: gradle/gradle-build-action@v2
with:
arguments: |
-PimageRepo=ghcr.io/${{ github.actor }}
-PimagePlatforms=linux/amd64,linux/arm64
-PimagePush=true
-PimageCacheFrom=type=gha
-PimageCacheTo=type=gha,mode=max
buildSimpleBootImage