From 1c4387bd10df65e00894e61fec9efb253573259a Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Mon, 5 Oct 2026 10:10:40 -0400 Subject: [PATCH] Update PHP versions for 2026-10; build imagick, memcached and yaml from git on 8.6 Refresh the Latest Version numbers in the README to match what Alpine edge currently ships: - 8.6: 8.6.0beta2 -> 8.6.0rc2 - 8.5: 8.5.10 -> 8.5.11 - 8.4: 8.4.25 -> 8.4.26 - 8.3: 8.3.33 -> 8.3.35 PECL entries in config/php-*.yml accept new optional keys: - source: {repository, reference} builds the extension from a git repository instead of the pecl.php.net release - buildPackages / packages: build-only and runtime packages that belong to a single extension - enable: False compiles the extension but does not create its .ini PHP 8.6: Alpine has no package for imagick, memcached and yaml, and their latest PECL releases do not compile on 8.6, so they are built from a pinned upstream commit until Alpine publishes them. imagick is compiled but not enabled, since the ImageMagick runtime is not shipped; docs/dockerfile.md explains how to turn it on. PHP 8.2-8.6: remove pecl-mcrypt (deprecated since PHP 7.1). It was still enabled on 8.2 and 8.3. Replace the commented opcache and imagick lines with comments saying opcache is built into PHP since 8.5 and imagick is installed on demand. Docs and landing page updated to match. --- README.md | 15 ++++++++------- assets/index.html | 2 -- config/php-8.2.yml | 3 +-- config/php-8.3.yml | 3 +-- config/php-8.4.yml | 3 +-- config/php-8.5.yml | 5 ++--- config/php-8.6.yml | 34 +++++++++++++++++++++++++++++++--- docs/building.md | 15 +++++++++++++-- docs/dockerfile.md | 22 ++++++++++++++++------ docs/image-base.md | 2 +- docs/security.md | 9 ++++++--- templates/php-base.j2 | 10 ++++++---- 12 files changed, 86 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index c0bba20..06c3fab 100644 --- a/README.md +++ b/README.md @@ -68,10 +68,10 @@ Five different images for each PHP Version: | Version | Latest Version | Monthly Builds | Alpine Version | |:----------:|:----------------:|:--------------:|:----------------:| -| **8.6** ⚠ | **8.6.0beta2** | **yes** | **edge/testing** | -| **8.5** | **8.5.10** | **yes** | **edge** | -| **8.4** | **8.4.25** | **yes** | **edge** | -| **8.3** | **8.3.33** | **yes** | **edge** | +| **8.6** ⚠ | **8.6.0rc2** | **yes** | **edge/testing** | +| **8.5** | **8.5.11** | **yes** | **edge** | +| **8.4** | **8.4.26** | **yes** | **edge** | +| **8.3** | **8.3.35** | **yes** | **edge** | | 8.2 | 8.2.31 | - | 3.22 | | 8.1 | 8.1.31 | - | 3.19 | | 8.0 | 8.0.30 | - | 3.16 | @@ -82,9 +82,10 @@ Five different images for each PHP Version: | 7.0 | 7.0.33 | - | 3.5 | | 5.6 | 5.6.40 | - | 3.8 | -⚠ PHP 8.6 is a **pre-release** (beta). The images are meant for early testing only and do not -ship the `redis`, `memcached` and `yaml` extensions yet, since Alpine has not published them for -PHP 8.6. +⚠ PHP 8.6 is a **pre-release** (release candidate). The images are meant for early testing only. Alpine has not +published `imagick`, `memcached` and `yaml` for PHP 8.6 yet, so these three are built from their +upstream git repositories until it does. `imagick` is shipped disabled; see +[Imagick on PHP 8.6](docs/dockerfile.md#imagick-on-php-86). :::info PHP versions with monthly builds receive regular updates. Legacy versions (without monthly builds) are no longer supported. diff --git a/assets/index.html b/assets/index.html index a52d66d..e74cad4 100644 --- a/assets/index.html +++ b/assets/index.html @@ -120,11 +120,9 @@

Pre-installed Extensio
gettext
iconv
igbinary
-
imagick
intl
json
mbstring
-
mcrypt
memcached
mongodb
mysqli
diff --git a/config/php-8.2.yml b/config/php-8.2.yml index 17f2ba3..de22c76 100644 --- a/config/php-8.2.yml +++ b/config/php-8.2.yml @@ -36,8 +36,7 @@ extensions: - pdo_pgsql - pdo_sqlite - pear -# - pecl-imagick - - pecl-mcrypt +# imagick: not bundled. Install when needed: apk add php82-pecl-imagick - pecl-memcached - pecl-mongodb - pecl-xdebug diff --git a/config/php-8.3.yml b/config/php-8.3.yml index 88c1c0a..ca68aa8 100644 --- a/config/php-8.3.yml +++ b/config/php-8.3.yml @@ -36,8 +36,7 @@ extensions: - pdo_pgsql - pdo_sqlite - pear -# - pecl-imagick - - pecl-mcrypt +# imagick: not bundled. Install when needed: apk add php83-pecl-imagick - pecl-memcached - pecl-mongodb - pecl-xdebug diff --git a/config/php-8.4.yml b/config/php-8.4.yml index bcd5271..f3ed116 100644 --- a/config/php-8.4.yml +++ b/config/php-8.4.yml @@ -36,8 +36,7 @@ extensions: - pdo_pgsql - pdo_sqlite - pear -# - pecl-imagick -# - pecl-mcrypt +# imagick: not bundled. Install when needed: apk add php84-pecl-imagick - pecl-memcached - pecl-mongodb - pecl-xdebug diff --git a/config/php-8.5.yml b/config/php-8.5.yml index 4c92dec..5e7a8d7 100644 --- a/config/php-8.5.yml +++ b/config/php-8.5.yml @@ -28,7 +28,7 @@ extensions: - mysqli - mysqlnd - openssl -# - opcache +# opcache: built into the PHP binary since 8.5, no package needed - pcntl - pdo - pdo_dblib @@ -36,8 +36,7 @@ extensions: - pdo_pgsql - pdo_sqlite - pear -# - pecl-imagick -# - pecl-mcrypt +# imagick: not bundled. Install when needed: apk add php85-pecl-imagick - pecl-memcached - pecl-mongodb - pecl-xdebug diff --git a/config/php-8.6.yml b/config/php-8.6.yml index 76efa17..9950309 100644 --- a/config/php-8.6.yml +++ b/config/php-8.6.yml @@ -28,7 +28,7 @@ extensions: - mysqli - mysqlnd - openssl -# - opcache +# opcache: built into the PHP binary since 8.5, no package needed - pcntl - pdo - pdo_dblib @@ -36,8 +36,7 @@ extensions: - pdo_pgsql - pdo_sqlite - pear -# - pecl-imagick -# - pecl-mcrypt +# imagick: see the `pecl` section below (compiled but not enabled) # - pecl-memcached - pecl-mongodb - pecl-xdebug @@ -65,6 +64,35 @@ pecl: zend: True config: - xdebug.remote_port=9001 + # The extensions below have no Alpine package for PHP 8.6 yet, and their latest pecl.php.net + # releases do not build on PHP 8.6 (XtOffsetOf / zval_dtor removed); the fix is only in git. + # Temporary: remove each entry and enable the matching `pecl-*` in `extensions` once Alpine + # publishes php86-pecl-imagick, php86-pecl-memcached and php86-pecl-yaml. + # imagick is only compiled, not enabled: the ImageMagick runtime is too large to ship by default. + # To use it: apk add imagemagick && echo "extension=imagick.so" > /etc/php86/conf.d/imagick.ini + - name: imagick + enable: False + source: + repository: https://github.com/Imagick/imagick.git + reference: 55ed2e9fda264395636a2e27e51f31673f5566ab + buildPackages: + - imagemagick-dev + - name: memcached + source: + repository: https://github.com/php-memcached-dev/php-memcached.git + reference: 0b52d3657140750fa0eddd20cdbfc6edc8fbdadd + buildPackages: + - libmemcached-dev + packages: + - libmemcached-libs + - name: yaml + source: + repository: https://github.com/php/pecl-file_formats-yaml.git + reference: a7a3b8680b8fbf0895fd63371a0ffc1305b1a5b8 + buildPackages: + - yaml-dev + packages: + - yaml composer: packages: diff --git a/docs/building.md b/docs/building.md index ee0506a..3303f75 100644 --- a/docs/building.md +++ b/docs/building.md @@ -141,9 +141,18 @@ pecl: - name: xdebug # required version: 2.5.5 # optional - if not set, get the latest install: False # optional - do not call pecl install + enable: False # optional - do not create the .ini file; the extension + # is left in the image but not loaded zend: True # optional - if true, add as zend extension config: # optional - if set, add extra config to php.ini - xdebug.remote_port=9001 # for this extension + source: # optional - build from a git repository instead of + repository: https://...git # downloading the release from pecl.php.net + reference: (COMMIT/TAG) # optional - if not set, use the default branch + buildPackages: # optional - temporary packages needed only to build + - (NAME) # this extension + packages: # optional - permanent packages this extension needs + - (NAME) # at runtime # Composer packages to be installed composer: @@ -157,12 +166,14 @@ composer: - phpbcbf - phpmd -# Temporary packages to be used to build the PECL packages +# Temporary packages to be used to build the PECL packages (generic; packages needed +# by a single extension go in `pecl[].buildPackages`) peclBuildPackages: - autoconf - build-base -# Permanent packages to be installed in the image +# Permanent packages to be installed in the image (generic; packages needed +# by a single extension go in `pecl[].packages`) additionalPackages: - libssl1.1 - libcrypto1.1 diff --git a/docs/dockerfile.md b/docs/dockerfile.md index 743c48f..99d36f8 100644 --- a/docs/dockerfile.md +++ b/docs/dockerfile.md @@ -71,11 +71,7 @@ FROM byjg/php:8.3-cli # Switch to root to install packages USER root -RUN apk add --no-cache imagemagick imagemagick-dev - -# Install PHP extensions if needed -RUN pecl install imagick && \ - echo "extension=imagick.so" > /etc/php/conf.d/imagick.ini +RUN apk add --no-cache php83-pecl-imagick # Switch back to app user USER app @@ -91,6 +87,21 @@ RUN composer install --no-dev --optimize-autoloader Always switch back to the `app` user after installing packages. Running your application as root negates security benefits. ::: +#### Imagick on PHP 8.6 + +The PHP 8.6 images already contain a compiled `imagick.so`, but it is not enabled and the +ImageMagick runtime is not installed. There is nothing to compile; install the runtime and +enable the extension: + +```dockerfile title="Dockerfile" +FROM byjg/php:8.6-cli + +USER root +RUN apk add --no-cache imagemagick && \ + echo "extension=imagick.so" > /etc/php86/conf.d/imagick.ini +USER app +``` + ### Full Configuration Example ```dockerfile title="Dockerfile" @@ -150,7 +161,6 @@ ENV PHP_CONTROLLER=/index.php # ENV DISABLEMODULE_msgpack=1 # ENV DISABLEMODULE_xdebug=1 # ENV DISABLEMODULE_yaml=1 -# ENV DISABLEMODULE_mcrypt=1 # ENV DISABLEMODULE_mongodb=1 # Copy application with proper ownership diff --git a/docs/image-base.md b/docs/image-base.md index e1aff90..35e4c48 100644 --- a/docs/image-base.md +++ b/docs/image-base.md @@ -17,7 +17,7 @@ All base images come with over 45 PHP extensions pre-installed: ``` bcmath, Core, ctype, curl, date, dba, dom, exif, fileinfo, filter, ftp, gd, gettext, -hash, iconv, igbinary, intl, json, libxml, mbstring, mcrypt, memcached, mongodb, +hash, iconv, igbinary, intl, json, libxml, mbstring, memcached, mongodb, mysqli, mysqlnd, openssl, pcntl, pcre, PDO, pdo_dblib, pdo_mysql, pdo_pgsql, pdo_sqlite, Phar, posix, readline, redis, Reflection, session, shmop, SimpleXML, soap, sockets, SPL, sqlite3, standard, tokenizer, xdebug, xml, xmlreader, xmlwriter, diff --git a/docs/security.md b/docs/security.md index 1f3f12c..a5d6f57 100644 --- a/docs/security.md +++ b/docs/security.md @@ -158,7 +158,7 @@ To balance security with stability: ### Why Edge/Testing for PHP 8.6? -PHP 8.6 has not been released yet — Alpine ships it as `8.6.0_betaX` in the `edge/testing` +PHP 8.6 has not been released yet — Alpine ships it as `8.6.0_rcX` in the `edge/testing` repository, which is the only Alpine repository carrying PHP 8.6 packages. **Do not use PHP 8.6 in production** until it reaches a stable release. These images exist for: @@ -166,8 +166,11 @@ repository, which is the only Alpine repository carrying PHP 8.6 packages. - Early adoption and compatibility testing - Previewing upcoming PHP features -Because PHP 8.6 is only available in `edge/testing`, a few extensions are **not** bundled in the -8.6 images yet: `redis`, `memcached` and `yaml`. They are added as soon as Alpine publishes them. +Because PHP 8.6 is only available in `edge/testing`, Alpine has not published every extension +for it yet. `imagick`, `memcached` and `yaml` are built from a pinned commit of their upstream +git repositories (see `pecl[].source` in `config/php-8.6.yml`), since their latest PECL releases +do not compile on PHP 8.6. They are replaced by the Alpine packages as soon as those are published. +`imagick` is compiled but not enabled; see [Imagick on PHP 8.6](dockerfile.md#imagick-on-php-86). ### Legacy PHP Versions (8.1 and older) diff --git a/templates/php-base.j2 b/templates/php-base.j2 index 138df4f..ea914db 100644 --- a/templates/php-base.j2 +++ b/templates/php-base.j2 @@ -7,12 +7,14 @@ apk --no-cache {% for rep in repositories %}--repository {{ rep }} {% endfor %} mkdir -p /etc/php/conf.d # Install PECL and additional packages -apk --no-cache {% for rep in repositories %}--repository {{ rep }} {% endfor %} add {% for pkg in additionalPackages %}{{ pkg }} {% endfor %} -apk --no-cache {% for rep in repositories %}--repository {{ rep }} {% endfor %} add --virtual .build php{{ version.suffix }}-pear php{{ version.suffix }}-dev {% for pkg in peclBuildPackages %}{{ pkg }} {% endfor %} +apk --no-cache {% for rep in repositories %}--repository {{ rep }} {% endfor %} add {% for pkg in additionalPackages %}{{ pkg }} {% endfor %}{% for ext in pecl %}{% for pkg in ext.packages | default([]) %}{{ pkg }} {% endfor %}{% endfor %} +apk --no-cache {% for rep in repositories %}--repository {{ rep }} {% endfor %} add --virtual .build php{{ version.suffix }}-pear php{{ version.suffix }}-dev {% for pkg in peclBuildPackages %}{{ pkg }} {% endfor %}{% for ext in pecl %}{% for pkg in ext.buildPackages | default([]) %}{{ pkg }} {% endfor %}{% endfor %} sed -ie "s/ -n / /" /usr/bin/pecl {% for ext in pecl -%} -{% if ext.install is not defined or ext.install %}yes "" | pecl install {{ ext.name }}{% if ext.version is defined %}-{{ ext.version }}{% endif %}{% endif %} -printf "{% if ext.zend %}zend_{% endif %}extension={{ ext.name }}.so{% for config in ext.config %}\n{{ config }}{% endfor %}\n" > /etc/php{{ version.suffix }}/conf.d/{{ ext.name }}.ini +{% if ext.install is not defined or ext.install %}{% if ext.source is defined %}git clone -q {{ ext.source.repository }} /tmp/pecl-{{ ext.name }} +(cd /tmp/pecl-{{ ext.name }} && git checkout -q {{ ext.source.reference | default('HEAD') }} && yes "" | pecl install package.xml) +rm -rf /tmp/pecl-{{ ext.name }}{% else %}yes "" | pecl install {{ ext.name }}{% if ext.version is defined %}-{{ ext.version }}{% endif %}{% endif %}{% endif %} +{% if ext.enable is not defined or ext.enable %}printf "{% if ext.zend %}zend_{% endif %}extension={{ ext.name }}.so{% for config in ext.config %}\n{{ config }}{% endfor %}\n" > /etc/php{{ version.suffix }}/conf.d/{{ ext.name }}.ini{% endif %} {% endfor %} apk del --no-cache .build