Publishing multi-architecture base images for services
The eventuate-examples-docker-images
project publishes Docker base images for the services, such as those in the Eventuate Tram Customers and Orders example application.
A service base image has a health check that pings the service’s health check endpoint.
It also ensures that a service’s Docker image uses the correct Java version with some suitable heap settings.
This post describes how I changed the project to publish a multi-architecture base image for Spring services.
I first describe the changes to the Dockerfile
.
After that, I describe the changes to the CircleCI pipeline.
The other articles in this series are:
- Part 1 - My Apple M1 MacBook: lots of cores, memory and crashing containers
- Part 2 - Building multi-architecture Docker images for Intel and ARM
- Part 3 - Configuring a CircleCI-based pipeline to build multi-architecture Docker images
- Part 4 - Testing an Intel and Arm multi-architecture Docker image on CircleCI
- Part 5 - Configuring CircleCI to publish a multi-architecture Docker image
- Part 6 - Developing the Eventuate Common library on an M1/Arm MacBook
- Part 7 - Configuring CircleCI to build, test and publish multi-architecture images for Eventuate Common
- Part 8 - Building a multi-architecture Docker image for Apache Kafka
- Part 10 - Publishing a multi-architecture Docker image for the Eventuate CDC service
- Part 11 - The Eventuate Tram Customers and Orders example now runs on Arm/M1 MacBook!!
Changing the Dockerfile to use a multi-architecture base image
This project builds and publishes separate service base images for Spring Boot, Micronaut, and Quarkus-based services. That’s because the Docker image’s health check must ping a framework-specific health check endpoint. I decided to first publish a multi-architecture Spring Boot base image.
I changed its Dockerfile
to use multi-architecture base image.
Originally, its Dockerfile
used an openjdk:8
base image.
I changed it to use the multi-architecture amazoncorretto:17.0.1-al2
base image:
FROM amazoncorretto:17.0.1-al2
HEALTHCHECK --start-period=30s --interval=5s CMD curl -f http://localhost:8080/actuator/health || exit 1
CMD java ${JAVA_OPTS:-"-Xmx64m"} -jar ${JAR:-"service.jar"}
Let’s now look at the changes I made to the CircleCI pipeline.
Configuring the CircleCI pipeline to run docker buildx build
This project has a very simple CircleCI pipeline. It consists of a single job that simply builds and publishes the Docker images. There are no tests (oops).
As a result, I only needed to make a couple of simple changes to the pipeline. First, I explicitly specified an up to date remote Docker:
- setup_remote_docker:
version: 20.10.11
Next, I added a job step that runs docker buildx build
to build and publish the multi-architecture base image for Spring services:
- run:
name: Publish multi-arch artifacts
command: |
docker context create tls-env
docker buildx create tls-env --use
docker run --privileged --rm tonistiigi/binfmt --install arm64,arm
./deploy-multi-arch-artifacts.sh
The deploy-multi-arch-artifacts.sh
script runs docker buildx build
, which publishes the base image for Spring services to Docker Hub.
I also removed the Spring base image from the Docker Compose file so that the single architecture version is no longer built.
Using the base images
Once the project’s CircleCI pipeline was successfully publishing the multi-architecture base image, I changed the Eventuate Tram Customers and Orders example application’s services’ (customer-service
, order-service
and order-history-service
) Dockerfiles to use it.
For example:
ARG baseImageVersion
FROM eventuateio/eventuate-examples-docker-images-spring-example-base-image:$baseImageVersion
ARG jarDir=build/libs
COPY $jarDir/customer-service-*.jar service.jar
The example application is now one step closer to running on my MacBook.
Viewing the changes
To see the changes I made to the eventuate-examples-docker-images
project, take a look at this Github commit.
In the next article, I’ll describe the changes that I made to the eventuate-cdc project so that it publishes a multi-architecture Eventuate CDC service.