Adding wkhtmltopdf to the Sylius Alpine Docker image
While preparing a Sylius Docker image for one of our merchants, I realized that I needed to add wkhtmltopdf to the Alpine Docker image as it is a requirement of the Sylius Invoicing Plugin we are using in the project.
Not a big deal, I thought. But when I tried running apk add --no-cache wkhtmltopdf in Alpine to install the wkhtmltopdf package, I got the following error message:
ERROR: unable to select packages:
  wkhtmltopdf (no such package):
    required by: world[wkhtmltopdf]
At first, I thought maybe the package was called differently on Alpine, but a quick search on pkgs.alpinelinux.org showed that Alpine 3.14 was the last version with which the wkhtmltopdf package was shipped.
While checking for alternative solutions, I came across the Surnet/docker-wkhtmltopdf GitHub repository, which offers wkhtmltopdf builds for multiple Alpine images, e.g., Alpine 3.19, which is the version I wanted to use initially.
That means, I can include the Docker image in my multi-stage Docker build and copy the needed files over. A very stripped-down version of my Dockerfile looks like this:
FROM surnet/alpine-wkhtmltopdf:3.16.2-0.12.6-full as wkhtmltopdf
FROM php:8.2-fpm-alpine3.19 AS sylius_php
# install wkhtmltopdf runtime dependencies
RUN apk add --no-cache \
        libstdc++ \
        libx11 \
        libxrender \
        libxext \
        libssl3 \
        ca-certificates \
        fontconfig \
        freetype \
        ttf-droid \
        ttf-freefont \
        ttf-liberation;
# Copy needed wkhtmltopdf files from wkhtmltopdf image
COPY  /bin/wkhtmltoimage /bin/wkhtmltopdf /bin/libwkhtmltox* /bin/
To make sure Sylius can find the binaries, we need to configure the paths in the respective environment variables, e.g., in the .env file:
WKHTMLTOPDF_PATH=/bin/wkhtmltopdf
WKHTMLTOIMAGE_PATH=/bin/wkhtmltoimage
