# Quarkus Base Runtime Image

To ease the containerization of native executables, Quarkus provides a base image providing the requirements to run these executables. The `ubi9-quarkus-micro-image:2.0` image is:

- small (based on `ubi9-micro`)

- designed for containers

- contains the right set of dependencies (glibc, libstdc++, zlib)

- support upx-compressed executables (more details on the enabling compression documentation)

## Using the base image

In your `Dockerfile`, just use:

    FROM quay.io/quarkus/ubi9-quarkus-micro-image:2.0
    WORKDIR /work/
    COPY --chmod=0755 target/*-runner /work/application
    EXPOSE 8080
    CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

## Extending the image

Your application may have additional requirements. For example, if you have an application that requires `libfreetype.so`, you need to copy the native libraries to the container. In this case, you need to use a multi-stage `dockerfile` to copy the required libraries:

    # First stage - install the dependencies in an intermediate container
    FROM registry.access.redhat.com/ubi9/ubi-minimal:9.5 as BUILD
    RUN microdnf install freetype -y

    # Second stage - copy the dependencies
    FROM quay.io/quarkus/ubi9-quarkus-micro-image:2.0
    COPY --from=BUILD \
       /lib64/libfreetype.so.6 \
       /lib64/libbz2.so.1 \
       /lib64/libpng16.so.16 \
       /lib64/

    WORKDIR /work/
    COPY --chmod=0755 target/*-runner /work/application
    EXPOSE 8080
    CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

If you need to have access to the full AWT support, you need more than just `libfreetype.so`, but also the font and font configurations:

    # First stage - install the dependencies in an intermediate container
    FROM registry.access.redhat.com/ubi9/ubi-minimal:9.5 as BUILD
    RUN microdnf install freetype fontconfig -y

    # Second stage - copy the dependencies
    FROM quay.io/quarkus/ubi9-quarkus-micro-image:2.0
    COPY --from=BUILD \
       /lib64/libfreetype.so.6 \
       /lib64/libgcc_s.so.1 \
       /lib64/libbz2.so.1 \
       /lib64/libpng16.so.16 \
       /lib64/libm.so.6 \
       /lib64/libbz2.so.1 \
       /lib64/libuuid.so.1 \
       /lib64/

    COPY --from=BUILD \
       /usr/lib64/libfontconfig.so.1 \
       /usr/lib64/

    COPY --from=BUILD \
        /usr/share/fonts /usr/share/fonts

    COPY --from=BUILD \
        /usr/share/fontconfig /usr/share/fontconfig

    COPY --from=BUILD \
        /usr/lib/fontconfig /usr/lib/fontconfig

    COPY --from=BUILD \
         /etc/fonts /etc/fonts

    WORKDIR /work/
    COPY --chmod=0755 target/*-runner /work/application
    EXPOSE 8080
    CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

## Alternative - Using ubi-minimal

If the micro image does not suit your requirements, you can use ubi9-minimal. It’s a bigger image, but contains more utilities and is closer to a full Linux distribution. Typically, it contains a package manager (`microdnf`), so you can install packages more easily.

To use this base image, use the following `Dockerfile`:

    FROM registry.access.redhat.com/ubi9/ubi-minimal:9.5
    WORKDIR /work/
    RUN chown 1001 /work \
        && chmod "g+rwX" /work \
        && chown 1001:root /work
    COPY --chown=1001:root --chmod=0755 target/*-runner /work/application

    EXPOSE 8080
    USER 1001

    CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]