Do you want smaller images with a faster startup time? Use UPX to compress your executable inside your image. Use a UPX image!

For more information on the internals of UPX take a look at their website here. Or at the source code of UPX here.

We will use an existing project from a previous post on native images. We will take this small image and make it even smaller.

Starting image

The project contains a maven build that produces an executable jar. In the Dockerfile we create a native image from this jar and copy it into the image.

# Copy the shaded application jar file to the build directory
COPY target/grpc-cat-api-*.jar /home/build/

# Create the native image executable
RUN native-image -jar grpc-cat-api-*.jar && mv grpc-cat-api api

From the previous post we saw that we have an image of 77.2MB with a startup time of 27ms.

Schermafbeelding 2021 02 23 om 13.20.28 1 1024x53 - UPX IMAGE
Schermafbeelding 2021 02 23 om 13.21.06 1 1024x180 - UPX IMAGE

UPX

To use UPX we first have to install it and compress the executable after it is copied into the image.

# Install UPX
RUN microdnf update -y oraclelinux-release-el8 && microdnf --enablerepo ol8_codeready_builder install xz && microdnf clean all && \
    curl --location --output upx-3.96-amd64_linux.tar.xz "https://github.com/upx/upx/releases/download/v3.96/upx-3.96-amd64_linux.tar.xz" && \
    tar -xJf upx-3.96-amd64_linux.tar.xz && \
    cp upx-3.96-amd64_linux/upx /bin/

# Copy the shaded application jar file to the build directory
COPY target/grpc-cat-api-*.jar /home/build/

# Create the native image executable
RUN native-image -jar grpc-cat-api-*.jar && mv grpc-cat-api api

# Compress executable with UPX
RUN upx --best --lzma api

Notice that we install the dependencies, download UPX and extract it. This is just in the building image and will not effect the final image.

Results

Lets build and run the image and see wat we have gained…

docker build -t grpc-cat-api:1.0.1 .
Schermafbeelding 2021 02 23 om 14.23.13 1024x73 - UPX IMAGE
Schermafbeelding 2021 02 23 om 14.22.59 1024x180 - UPX IMAGE

Wow! We have an image of 31MB with a startup time of 17ms. Nice!

Hopefully you are now able to use UPX to compress your executable into a UPX image. Happy compressing!