Skip to content

Commit 237481d

Browse files
#9 - Build xberg PHP extension alongside kreuzberg in 8.5 image
1 parent cf33044 commit 237481d

1 file changed

Lines changed: 72 additions & 1 deletion

File tree

8.5/Dockerfile

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
4040
ENV PATH="/root/.cargo/bin:${PATH}"
4141

4242
ARG KREUZBERG_VERSION=v4.9.8
43-
RUN git clone --depth 1 --branch ${KREUZBERG_VERSION} https://github.com/kreuzberg-dev/kreuzberg.git /tmp/kreuzberg \
43+
# v4 LTS moved to kreuzberg-lts; the old repo redirects to xberg-io/xberg which has no v4 tags
44+
RUN git clone --depth 1 --branch ${KREUZBERG_VERSION} https://github.com/kreuzberg-dev/kreuzberg-lts.git /tmp/kreuzberg \
4445
&& cd /tmp/kreuzberg/crates/kreuzberg-php \
4546
&& for i in 1 2 3 4 5; do \
4647
cargo build --release && break || { \
@@ -50,6 +51,62 @@ RUN git clone --depth 1 --branch ${KREUZBERG_VERSION} https://github.com/kreuzbe
5051
done \
5152
&& test -f /tmp/kreuzberg/target/release/libkreuzberg_php.so
5253

54+
# -----------------------------------------------------
55+
# Build xberg PHP extension from Rust source
56+
# (successor to kreuzberg, see kreuzberg migration docs)
57+
# -----------------------------------------------------
58+
FROM php:$PHP_VERSION-fpm AS xberg-builder
59+
60+
# Install build dependencies (tesseract is vendored/statically built by xberg)
61+
RUN apt-get update && \
62+
apt-get install -y --no-install-recommends \
63+
cmake \
64+
g++ \
65+
pkg-config \
66+
libssl-dev \
67+
libmagic-dev \
68+
libuv1-dev \
69+
libde265-dev \
70+
libaom-dev \
71+
libx265-dev \
72+
libdav1d-dev \
73+
libnuma-dev \
74+
clang \
75+
curl \
76+
file \
77+
git \
78+
&& \
79+
apt-get clean && \
80+
rm -rf /var/lib/apt/lists/*
81+
82+
# xberg's heic feature links system libheif >= 1.21; trixie ships 1.19
83+
ARG LIBHEIF_VERSION=1.23.0
84+
RUN curl -fsSL "https://github.com/strukturag/libheif/releases/download/v${LIBHEIF_VERSION}/libheif-${LIBHEIF_VERSION}.tar.gz" | tar xz -C /tmp \
85+
&& cmake -S /tmp/libheif-${LIBHEIF_VERSION} -B /tmp/libheif-build \
86+
-DCMAKE_BUILD_TYPE=Release \
87+
-DCMAKE_INSTALL_PREFIX=/usr/local \
88+
-DCMAKE_INSTALL_LIBDIR=lib \
89+
-DWITH_EXAMPLES=OFF \
90+
-DWITH_GDK_PIXBUF=OFF \
91+
-DBUILD_TESTING=OFF \
92+
&& cmake --build /tmp/libheif-build -j"$(nproc)" \
93+
&& cmake --install /tmp/libheif-build \
94+
&& rm -rf /tmp/libheif-*
95+
96+
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
97+
ENV PATH="/root/.cargo/bin:${PATH}"
98+
99+
ARG XBERG_VERSION=v1.0.0-rc.28
100+
RUN git clone --depth 1 --recurse-submodules --shallow-submodules --branch ${XBERG_VERSION} https://github.com/xberg-io/xberg.git /tmp/xberg \
101+
&& cd /tmp/xberg/crates/xberg-php \
102+
&& for i in 1 2 3 4 5; do \
103+
cargo build --release && break || { \
104+
echo "cargo build failed (attempt $i), retrying in $((i*30))s..."; \
105+
sleep $((i*30)); \
106+
}; \
107+
done \
108+
&& test -f /tmp/xberg/target/release/libxberg_php.so
109+
53110
# -----------------------------------------------------
54111
# App Itself
55112
# -----------------------------------------------------
@@ -96,6 +153,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends ${BUILD_DEPS} \
96153
jpegoptim \
97154
optipng \
98155
pngquant \
156+
# libheif codec runtimes for ext-xberg
157+
libde265-0 \
158+
libaom3 \
159+
libx265-215 \
160+
libdav1d7 \
161+
libnuma1 \
99162
&& rm -rf /var/lib/apt/lists/*
100163

101164

@@ -104,6 +167,14 @@ COPY --from=kreuzberg-builder /tmp/kreuzberg/target/release/libkreuzberg_php.so
104167
RUN mv /tmp/kreuzberg.so $(php -r "echo ini_get('extension_dir');")/kreuzberg.so \
105168
&& echo "#extension=kreuzberg" > $PHP_INI_DIR/conf.d/kreuzberg.ini
106169

170+
# Xberg PHP extension (built from Rust source), successor to kreuzberg
171+
COPY --from=xberg-builder /tmp/xberg/target/release/libxberg_php.so /tmp/xberg.so
172+
RUN mv /tmp/xberg.so $(php -r "echo ini_get('extension_dir');")/xberg.so \
173+
&& echo "#extension=xberg" > $PHP_INI_DIR/conf.d/xberg.ini
174+
175+
# libheif >= 1.21 runtime for ext-xberg (apt ships older); resolved via LD_LIBRARY_PATH=/usr/local/lib
176+
COPY --from=xberg-builder /usr/local/lib/libheif.so.1* /usr/local/lib/
177+
107178
# Install latest libvips
108179
# @see https://github.com/dooman87/imagemagick-docker/blob/main/Dockerfile.bookworm
109180
ARG VIPS_VERSION=8.18.2

0 commit comments

Comments
 (0)