Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,15 @@ jobs:

- name: Build image
run: |
docker image build --tag utopia-base-test php-${{ matrix.php-versions }}/.
set -a
. ./versions/${{ matrix.php-versions }}.env
set +a
args=()
while IFS='=' read -r k _; do
[[ -z "$k" || "$k" =~ ^# ]] && continue
args+=(--build-arg "$k")
done < versions/${{ matrix.php-versions }}.env
docker image build "${args[@]}" --tag utopia-base-test .

- name: Save image
run: docker image save utopia-base-test -o image.tar
Expand Down Expand Up @@ -95,7 +103,7 @@ jobs:
sudo mv "$asset" /usr/local/bin/container-structure-test

- name: Run container structure tests
run: container-structure-test test --image utopia-base-test --config php-${{ matrix.php-versions }}/tests.yaml
run: container-structure-test test --image utopia-base-test --config tests.yaml

dive:
name: Dive (${{ matrix.php-versions }})
Expand Down
128 changes: 65 additions & 63 deletions php-8.3/Dockerfile → Dockerfile
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
FROM php:8.3-cli-alpine AS compile

ENV PHP_REDIS_VERSION="6.1.0" \
PHP_SWOOLE_VERSION="v6.2.0" \
PHP_IMAGICK_VERSION="3.7.0" \
PHP_YAML_VERSION="2.2.4" \
PHP_MAXMINDDB_VERSION="v1.12.0" \
PHP_SCRYPT_VERSION="2.0.1" \
PHP_ZSTD_VERSION="0.14.0" \
PHP_BROTLI_VERSION="0.15.0" \
PHP_SNAPPY_VERSION="0.2.2" \
PHP_LZ4_VERSION="0.4.4" \
PHP_XDEBUG_VERSION="3.4.1" \
PHP_MONGO_VERSION="2.2.1"
ARG PHP_VERSION=8.5
ARG PHP_API

FROM php:${PHP_VERSION}-cli-alpine AS compile
ARG PHP_API
ARG PHP_REDIS_VERSION
ARG PHP_SWOOLE_VERSION
ARG PHP_IMAGICK_VERSION
ARG PHP_YAML_VERSION
ARG PHP_MAXMINDDB_VERSION
ARG PHP_SCRYPT_VERSION
ARG PHP_ZSTD_VERSION
ARG PHP_BROTLI_VERSION
ARG PHP_SNAPPY_VERSION
ARG PHP_LZ4_VERSION
ARG PHP_XDEBUG_VERSION
ARG PHP_MONGO_VERSION

RUN \
apk add --no-cache --virtual .deps \
Expand All @@ -23,6 +26,7 @@ RUN \
gcc \
g++ \
git \
binutils \
zlib-dev \
openssl-dev \
yaml-dev \
Expand All @@ -38,133 +42,133 @@ RUN \
curl-dev \
cmake

RUN docker-php-ext-install sockets
RUN docker-php-ext-install sockets && \
strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/sockets.so

FROM compile AS redis
RUN \
# Redis Extension
git clone --depth 1 --branch $PHP_REDIS_VERSION https://github.com/phpredis/phpredis.git && \
cd phpredis && \
phpize && \
./configure && \
make && make install
make && make install && \
strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so

## Swoole Extension
FROM compile AS swoole
RUN \
git clone --depth 1 --branch $PHP_SWOOLE_VERSION https://github.com/swoole/swoole-src.git && \
cd swoole-src && \
phpize && \
./configure --enable-sockets --enable-http2 --enable-openssl --enable-swoole-curl && \
make && make install && \
strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so && \
cd ..

## Imagick Extension
FROM compile AS imagick
RUN \
git clone --depth 1 --branch $PHP_IMAGICK_VERSION https://github.com/imagick/imagick && \
cd imagick && \
phpize && \
./configure && \
make && make install
make && make install && \
strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so

## YAML Extension
FROM compile AS yaml
RUN \
git clone --depth 1 --branch $PHP_YAML_VERSION https://github.com/php/pecl-file_formats-yaml && \
cd pecl-file_formats-yaml && \
phpize && \
./configure && \
make && make install
make && make install && \
strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so

## Maxminddb extension
FROM compile AS maxmind
RUN \
git clone --depth 1 --branch $PHP_MAXMINDDB_VERSION https://github.com/maxmind/MaxMind-DB-Reader-php.git && \
cd MaxMind-DB-Reader-php && \
cd ext && \
phpize && \
./configure && \
make && make install
make && make install && \
strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so

# Zstd Compression
FROM compile AS zstd
RUN git clone --recursive -n https://github.com/kjdev/php-ext-zstd.git \
&& cd php-ext-zstd \
&& git checkout $PHP_ZSTD_VERSION \
&& phpize \
&& ./configure --with-libzstd \
&& make && make install
&& make && make install \
&& strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so

## Brotli Extension
FROM compile AS brotli
RUN git clone https://github.com/kjdev/php-ext-brotli.git \
&& cd php-ext-brotli \
&& git reset --hard $PHP_BROTLI_VERSION \
&& phpize \
&& ./configure --with-libbrotli \
&& make && make install
&& make && make install \
&& strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so

## LZ4 Extension
FROM compile AS lz4
RUN git clone --recursive https://github.com/kjdev/php-ext-lz4.git \
&& cd php-ext-lz4 \
&& git reset --hard $PHP_LZ4_VERSION \
&& phpize \
&& ./configure --with-lz4-includedir=/usr \
&& make && make install
&& make && make install \
&& strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so

## Snappy Extension
FROM compile AS snappy
RUN git clone --recursive https://github.com/kjdev/php-ext-snappy.git \
&& cd php-ext-snappy \
&& git reset --hard $PHP_SNAPPY_VERSION \
&& phpize \
&& ./configure \
&& make && make install
&& make && make install \
&& strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so

## Scrypt Extension
FROM compile AS scrypt
RUN git clone --depth 1 https://github.com/DomBlack/php-scrypt.git \
&& cd php-scrypt \
&& git reset --hard $PHP_SCRYPT_VERSION \
&& phpize \
&& ./configure --enable-scrypt \
&& make && make install
&& make && make install \
&& strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so

## XDebug Extension
FROM compile AS xdebug
RUN \
git clone --depth 1 --branch $PHP_XDEBUG_VERSION https://github.com/xdebug/xdebug && \
cd xdebug && \
phpize && \
./configure && \
make && make install
make && make install && \
strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so

## MongoDB Extension
FROM compile AS mongodb
RUN \
git clone --depth 1 --recursive --branch $PHP_MONGO_VERSION https://github.com/mongodb/mongo-php-driver.git && \
cd mongo-php-driver && \
phpize && \
./configure && \
make && make install
make && make install && \
strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/*.so
Comment on lines 48 to +156

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 ARG PHP_API missing in all builder stages

Docker ARG values do not propagate across FROM instructions — each stage must re-declare every ARG it intends to use. The compile stage declares ARG PHP_API (line 5), but none of the 12 downstream stages (redis, swoole, imagick, yaml, maxmind, zstd, brotli, lz4, snappy, scrypt, xdebug, mongodb) do. As a result ${PHP_API} expands to an empty string in every one of them. The strip command becomes strip --strip-unneeded /usr/local/lib/php/extensions/no-debug-non-zts-/*.so, which references a non-existent directory; strip (binutils) exits non-zero, and the entire build fails for every PHP version.

The fix is to add ARG PHP_API immediately after each FROM compile AS <stage> line — the same pattern already correctly applied to the final stage at line 159.


FROM php:8.3-cli-alpine AS final
FROM php:${PHP_VERSION}-cli-alpine AS final
ARG PHP_API

LABEL maintainer="team@appwrite.io"

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN \
apk update \
&& apk add --no-cache \
linux-headers \
apk add --no-cache \
rsync \
brotli-dev \
lz4-dev \
zstd-dev \
yaml-dev \
brotli-libs \
lz4-libs \
zstd-libs \
yaml \
imagemagick \
libjpeg-turbo \
libjxl \
Expand All @@ -173,26 +177,24 @@ RUN \
imagemagick-heic \
libgomp \
libwebp \
git \
&& rm -rf /var/cache/apk/*

RUN docker-php-ext-install sockets
git

WORKDIR /usr/src/code

COPY --from=swoole /usr/local/lib/php/extensions/no-debug-non-zts-20230831/swoole.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
COPY --from=redis /usr/local/lib/php/extensions/no-debug-non-zts-20230831/redis.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
COPY --from=imagick /usr/local/lib/php/extensions/no-debug-non-zts-20230831/imagick.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
COPY --from=yaml /usr/local/lib/php/extensions/no-debug-non-zts-20230831/yaml.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
COPY --from=scrypt /usr/local/lib/php/extensions/no-debug-non-zts-20230831/scrypt.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
COPY --from=zstd /usr/local/lib/php/extensions/no-debug-non-zts-20230831/zstd.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
COPY --from=brotli /usr/local/lib/php/extensions/no-debug-non-zts-20230831/brotli.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
COPY --from=lz4 /usr/local/lib/php/extensions/no-debug-non-zts-20230831/lz4.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
COPY --from=snappy /usr/local/lib/php/extensions/no-debug-non-zts-20230831/snappy.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
COPY --from=xdebug /usr/local/lib/php/extensions/no-debug-non-zts-20230831/xdebug.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
COPY --from=mongodb /usr/local/lib/php/extensions/no-debug-non-zts-20230831/mongodb.so /usr/local/lib/php/extensions/no-debug-non-zts-20230831/

# Enable Extensions
COPY --from=compile /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/sockets.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/
COPY --from=compile /usr/local/etc/php/conf.d/docker-php-ext-sockets.ini /usr/local/etc/php/conf.d/
COPY --from=swoole /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/swoole.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/
COPY --from=redis /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/redis.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/
COPY --from=imagick /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/imagick.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/
COPY --from=yaml /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/yaml.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/
COPY --from=scrypt /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/scrypt.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/
COPY --from=zstd /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/zstd.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/
COPY --from=brotli /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/brotli.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/
COPY --from=lz4 /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/lz4.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/
COPY --from=snappy /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/snappy.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/
COPY --from=xdebug /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/xdebug.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/
COPY --from=mongodb /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/mongodb.so /usr/local/lib/php/extensions/no-debug-non-zts-${PHP_API}/

RUN echo extension=swoole.so >> /usr/local/etc/php/conf.d/swoole.ini
RUN echo extension=redis.so >> /usr/local/etc/php/conf.d/redis.ini
RUN echo extension=imagick.so >> /usr/local/etc/php/conf.d/imagick.ini
Expand Down
15 changes: 13 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,18 @@ All publishing workflows share a `build-<sha>` concurrency group so a release qu

## Local development

A single `Dockerfile` is templated by the per-version configs in `versions/<X.Y>.env`:

```sh
docker build -t utopia-base-test php-8.4/.
container-structure-test test --image utopia-base-test --config php-8.4/tests.yaml
set -a && . versions/8.4.env && set +a
args=()
while IFS='=' read -r k _; do
[[ -z "$k" || "$k" =~ ^# ]] && continue
args+=(--build-arg "$k")
done < versions/8.4.env

docker build "${args[@]}" -t utopia-base-test .
container-structure-test test --image utopia-base-test --config tests.yaml
```

To bump an extension version, edit the relevant `versions/<X.Y>.env`. To add a new PHP version, drop in a new `versions/<X.Y>.env` and add the version to the matrix in `.github/workflows/ci.yml` and `publish.yml`.
34 changes: 0 additions & 34 deletions php-8.3/tests.yaml

This file was deleted.

Loading
Loading