Tested on 8.6.0RC4 · Updated
pecl: not found on php:8.6
The official php:8.6 Docker images have no pecl and no pear. This is deliberate, and it will not come back. The same images also leave out the built-in mbstring extension, and every variant is now built thread-safe (ZTS). PHP 8.6.0 is due on 19 November 2026; the release candidates are on Docker Hub today as php:8.6-rc-cli, php:8.6-rc-fpm-alpine and so on.
We ran 8.6.0RC4 next to 8.5.12 on three official images (cli-trixie, apache-trixie, fpm-alpine3.24) on 22 October 2026. Three things break when you move a Dockerfile from 8.5 to 8.6:
php:8.5.12 | php:8.6.0RC4 | |
|---|---|---|
pecl install apcu | installs | sh: 1: pecl: not found, exit code 127 |
| mbstring | built in | missing: mb_strlen() is Call to undefined function |
| Thread safety | non-thread-safe (NTS) | thread-safe (ZTS), on all three images |
mbstring has a tested one-line fix. Since 28 October, install-php-extensions also works on the 8.6 release candidates: in our 29 October run on RC4 it got seven common extensions loaded, mbstring included, and installed four PECL extensions. apcu and phpredis still fail with every tool we tried, because their latest releases do not compile against PHP 8.6. Commands and outputs are in the receipts.
Put mbstring back
Install the Oniguruma headers, then build mbstring from the PHP source that ships in the image. This worked on all three 8.6.0RC4 images.
Debian (cli, apache, fpm):
RUN apt-get update && apt-get install -y libonig-dev \
&& docker-php-ext-install mbstringAlpine:
RUN apk add --no-cache oniguruma-dev \
&& docker-php-ext-install mbstringCheck it:
php -r 'echo mb_strlen("é"), PHP_EOL;'That prints 1. Without the headers, docker-php-ext-install mbstring stops with configure: error: Package requirements (oniguruma) were not met. That part is not new: it fails the same way on 8.5.12, where nobody needed it because mbstring was already built in.
If you already use install-php-extensions, version 2.13.1, the one we tested, installs the headers and builds mbstring for you (below).
Laravel still resolves without it. composer update --dry-run for laravel/framework ^12.0 succeeded on 8.6.0RC4 without ext-mbstring, because symfony/ (v1.43.0) provides it. We did not run an application on the polyfill, so we did not measure its speed or edge cases. Code that calls mb_* functions with no polyfill installed fails with the fatal error above.
Extensions on 8.6: what installs today
The official image documentation on Docker Hub still shows pecl install redis-5.3.7 under "PECL extensions", with no note about 8.6 (read 22 October 2026). On 8.6 that line exits 127.
install-php-extensions now supports 8.6 release candidates. In mlocati/docker-php-extension-installer, version 2.12.5 added PHP 8.6 RC support on 28 October, and 2.12.6, 30 minutes later, added gd and mbstring for 8.6. We tested 2.13.1, the current release, on 29 October. This is the sequence we ran in each container, written as one Dockerfile step:
RUN curl -fsSL -o /usr/local/bin/install-php-extensions \
https://github.com/mlocati/docker-php-extension-installer/releases/download/2.13.1/install-php-extensions \
&& chmod +x /usr/local/bin/install-php-extensions \
&& install-php-extensions gd intl pdo_mysql zip bcmath mbstring opcacheOn php:8.6.0RC4 cli-trixie, cli-alpine3.24 and fpm-alpine3.24 it exited 0 and all seven extensions loaded. opcache is already in the image, and the installer said so and moved on. It installed the Oniguruma headers itself, and mb_strlen("é") printed 1.
Four PECL extensions also installed and loaded on cli-trixie and cli-alpine3.24. We ran each one on its own:
install-php-extensions mongodb: mongodb 2.5.5install-php-extensions uuid: uuid 1.3.0install-php-extensions xhprof: xhprof 2.3.10install-php-extensions event: event 3.1.6
The image has no pecl, so the installer sets up PEAR itself and downloads these from pecl.php.net. Its list of supported extensions in 2.13.1 names 68 for PHP 8.6, among them zstd, brotli, opentelemetry, parallel and inotify, which we did not run. apcu, redis, xdebug, imagick and igbinary are not on it. We did not test xdebug, imagick or igbinary.
apcu and phpredis still do not install. The installer no longer refuses 8.6. It downloads the latest releases, apcu 5.1.28 and phpredis 6.3.0, and their make step fails with exit code 1, on the same compiler errors as our hand builds below. Until 28 October the installer failed earlier: it refused 8.6 with Unsupported PHP version: 8.6, and its fallback tool, pickle, then crashed (the 22 October rows in the receipts). Releases before 2.12.5 have no 8.6 support, so an installer pinned to one of them still stops there. If you pin the installer, move the pin to 2.13.1, the version we ran.
PIE 1.5.3 builds an extension whose current release supports 8.6. pie install mongodb/ built and loaded mongodb 2.5.5 on 8.6.0RC4 cli-trixie, after we installed the build packages with apt. PIE warned that libtoolize was missing and built it anyway. For apcu it does no better than the installer: pie install apcu/apcu picked apcu 5.1.28, the latest release (December 2025), and its make step failed on 8.6.0RC4. The same command built and loaded apcu on 8.5.12. PIE wrote the compiler output to a temporary file inside the container, which was removed after the run, so we built the same apcu 5.1.28 release by hand (phpize && ./configure && make). It builds on 8.5.12 and stops on 8.6.0RC4 with apc.c:44:17: error: too many arguments to function 'php_verror': PHP 8.6 changed that function's arguments. apcu's 8.6 fixes are merged but not released: krakjoe/apcu#634 asks for a 5.1.29 release before PHP 8.6.
phpredis is in the same position. PIE picked 6.3.0, the latest release (November 2025), and its make step failed on 8.6.0RC4. A hand build of 6.3.0 works on 8.5.12; on 8.6.0RC4 it stops at functions the 8.6 headers no longer declare, among them zval_is_true, zval_dtor and ZEND_WRONG_PARAM_COUNT. phpredis merged its 8.6 build fixes in June and July 2026 (#2884, #2888) and has not released them yet.
Both tools install whatever release an extension has published. So before you change FROM php:8.5-… to 8.6, check that each extension you install has a release that builds on PHP 8.6. If you need apcu, phpredis or another extension whose latest release does not build, stay on 8.5 for now. If your image needs only extensions we ran above (the seven in the Dockerfile step, plus mongodb, uuid, xhprof and event), the installer gets it onto 8.6 RC today.
Every 8.6 image is thread-safe
On 8.5 the default images are non-thread-safe (NTS), and ZTS has its own zts tags. On 8.6 every variant is ZTS and no separate zts variant is built (docker-library/php#1686). The 8.6-rc-zts tags still on Docker Hub stopped updating at RC2 on 27 September. Extensions you compile in the image with docker-php-ext-install or PIE are built to match. A prebuilt binary extension made for NTS PHP will not load into ZTS PHP, so if you copy a vendor's .so into your image, get its ZTS build. We did not test any binary extensions. To check your PHP:
php -r 'echo PHP_ZTS, PHP_EOL;'That prints 1 on a ZTS build and an empty line on NTS.
When it reaches your Dockerfile
FROM php:8.5-fpmand other tags with a minor version: nothing changes on 19 November. You meet the three changes when you edit the tag to8.6. In a GitHub code-search sample of public Dockerfiles that runpecl installon the official image, 93% of those build stages (2,275 of 2,438) pin a minor version.php:8-…,php:latest,php:fpm,php:alpineand other tags without a minor version: these will move to 8.6. Last year the8andlatesttags moved to 8.5 on its release day. Your next rebuild after the move gets an image without pecl and mbstring.- CI matrices that already test
8.6-rc: you can hit all three now.
The 8.6 images are release candidates until 19 November. On that day we will check the final images and the moved tags again and update this page if anything differs.
Text for your ticket
Affected? Paste this into your team's work item. It ends with a link back to this page.
In the box: Ctrl+A (⌘A on a Mac), then copy. On a phone: press and hold, then Select All.
Receipts
The first runs were on our own host on 22 October 2026: one container per test, on these image digests. This was not independently reproduced.
| Image | Digest |
|---|---|
php:8.6.0RC4-cli-trixie | sha256:b0d0fead5c9acb61369f57eac767bb4912042e023a1bf5c1c05d9ad0aea43e3e |
php:8.6.0RC4-apache-trixie | sha256:4756f73d6161a33af0cd1e13e66b229a111555f711fef6fd8f1d8407c57d27cb |
php:8.6.0RC4-fpm-alpine3.24 | sha256:ce83570220c1af386187300ee5b05331747103fef53a242acc5c3ab05b25329c |
php:8.5.12-cli-trixie | sha256:595a7cbb1e0547336319f228c4dc991c2a199350ab12b1c8fda05f73abd06e6b |
php:8.5.12-apache-trixie | sha256:e25ab14ef2cfec3bab9dd66c6cf871691146f428fbd72241b1a2c38fcacf92f5 |
php:8.5.12-fpm-alpine3.24 | sha256:4943e6c8a08008605b470f6171d611a89384bac97188e4b0a7aefd3f793cd040 |
Tools: PIE 1.5.3, Composer 2.10.3, install-php-extensions at commit 611df5a7.
| Test | 8.5.12 (3 images) | 8.6.0RC4 (3 images) |
|---|---|---|
command -v pecl, command -v pear | found | not found, exit 127 |
pecl install apcu | exit 0 | pecl: not found, exit 127 |
php -r 'echo mb_strlen("é"), PHP_EOL;' | 1 | Call to undefined function mb_strlen(), exit 255 |
php -r 'echo PHP_ZTS;' | prints nothing (NTS) | 1 (ZTS) |
docker-php-ext-install mbstring, no extra packages | fails: oniguruma not found | fails: oniguruma not found |
libonig-dev (Alpine: oniguruma-dev), then docker-php-ext-install mbstring | builds | builds, mb_strlen prints 1 |
install-php-extensions apcu | installs | Unsupported PHP version: 8.6, then pickle: Extension 'mbstring' required but not loaded |
git and unzip installed, then pie install --no-interaction apcu/apcu | apcu 5.1.28 loaded | apcu 5.1.28 make fails |
composer update --dry-run, laravel/framework ^12.0 | resolves | resolves through symfony/ |
composer update --dry-run, symfony/console ^7.0 | resolves | resolves |
Follow-up later on 22 October, on cli-trixie only, one run each:
| Test | 8.5.12 | 8.6.0RC4 |
|---|---|---|
apcu 5.1.28 from pecl.php.net, phpize && ./configure && make | builds | too many arguments to function 'php_verror' |
| phpredis 6.3.0, the same build | builds | implicit declaration of function 'zval_is_true', and others |
pie install --no-interaction phpredis/phpredis | not run | phpredis 6.3.0 make fails |
libonig-dev, docker-php-ext-install mbstring, then install-php-extensions apcu and redis | not run | mbstring loads; pickle: cannot access protected method Composer\Util\RemoteFilesystem:, exit 255 |
The first test ran twice on each image with the same results. On Alpine, the pecl and PIE tests installed $PHPIZE_DEPS first. PIE warned on every image, 8.5.12 included, that libtoolize was missing.
Second run, 29 October 2026, after install-php-extensions added 8.6 support. Our own host again, x86_64, one fresh container per test, one run each, not independently reproduced. The same tags now point to newer image builds than on 22 October, so the digests differ:
| Image | Digest |
|---|---|
php:8.6.0RC4-cli-trixie | sha256:2ec2a3449aaf35a555e99c0464ed8aced0ae1afd6db6792acb204296f3100e26 |
php:8.6.0RC4-cli-alpine3.24 | sha256:c9c90988b028655d7601a8d780ab5e068abd1c5f430cc0ee642755b94dd46583 |
php:8.6.0RC4-fpm-alpine3.24 | sha256:afd7a0a4339102708322d2d4ecc93e0831d493e362b2493375826239fcf86efe |
php:8.5.12-cli-trixie | sha256:acaa95199b53a1d7c346dddc7bcfc367ef3bd21ab832bd178eac7f043ed5396c |
Tools: install-php-extensions 2.13.1 (sha256 3c3f3de26458405199f1f3a4c7130fdd2056daf596c05512badd769a77019b59), downloaded from its release page inside each container; PIE 1.5.3.
| Test | 8.5.12 (cli-trixie) | 8.6.0RC4 |
|---|---|---|
install-php-extensions gd intl pdo_mysql zip bcmath mbstring opcache | exit 0, all load | exit 0, all load, on all three images; mb_strlen prints 1 |
install-php-extensions mongodb | mongodb 2.5.5, exit 0 | mongodb 2.5.5, exit 0 (cli-trixie, cli-alpine3.24) |
install-php-extensions uuid, then xhprof, then event, each in its own container | not run | uuid 1.3.0, xhprof 2.3.10, event 3.1.6, each exit 0 (cli-trixie, cli-alpine3.24) |
install-php-extensions apcu | not run | apcu 5.1.28 make fails: too many arguments to function 'php_verror', exit 1 (cli-trixie) |
install-php-extensions redis | not run | phpredis 6.3.0 make fails: implicit declaration of function 'XtOffsetOf', exit 1 (cli-trixie) |
build packages with apt, then php pie.phar install mongodb/ | not run | mongodb 2.5.5 "enabled and loaded", exit 0 (cli-trixie) |
Unsupported PHP version and pickle appear in none of the 29 October logs. The apt packages for the PIE test were git unzip autoconf gcc g++ make pkg-config libssl-dev libsasl2-dev libicu-dev zlib1g-dev libsnappy-dev libzstd-dev.
Sources: the removal of pecl and pear and the mbstring change, docker-library/php#1654; the maintainer's "this is intentional and this time it's for keeps", docker-library/php#1682; the release date, the PHP 8.6 release schedule (RC5 on 5 November, GA on 19 November).
Changed on 30 October 2026: install-php-extensions added PHP 8.6 RC support on 28 October, so this page now shows what it installs. The 22 October version said the installer refused 8.6 and advised staying on 8.5. That advice now applies only if you need an extension whose latest release does not build on 8.6, such as apcu or phpredis. The 22 October results stay in the receipts.