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.12php:8.6.0RC4
pecl install apcuinstallssh: 1: pecl: not found, exit code 127
mbstringbuilt inmissing: mb_strlen() is Call to undefined function
Thread safetynon-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 mbstring

Alpine:

RUN apk add --no-cache oniguruma-dev \
	&& docker-php-ext-install mbstring

Check 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/polyfill-mbstring (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 opcache

On 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.5
  • install-php-extensions uuid: uuid 1.3.0
  • install-php-extensions xhprof: xhprof 2.3.10
  • install-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/mongodb-extension 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-fpm and other tags with a minor version: nothing changes on 19 November. You meet the three changes when you edit the tag to 8.6. In a GitHub code-search sample of public Dockerfiles that run pecl install on the official image, 93% of those build stages (2,275 of 2,438) pin a minor version.
  • php:8-…, php:latest, php:fpm, php:alpine and other tags without a minor version: these will move to 8.6. Last year the 8 and latest tags 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.

ImageDigest
php:8.6.0RC4-cli-trixiesha256:b0d0fead5c9acb61369f57eac767bb4912042e023a1bf5c1c05d9ad0aea43e3e
php:8.6.0RC4-apache-trixiesha256:4756f73d6161a33af0cd1e13e66b229a111555f711fef6fd8f1d8407c57d27cb
php:8.6.0RC4-fpm-alpine3.24sha256:ce83570220c1af386187300ee5b05331747103fef53a242acc5c3ab05b25329c
php:8.5.12-cli-trixiesha256:595a7cbb1e0547336319f228c4dc991c2a199350ab12b1c8fda05f73abd06e6b
php:8.5.12-apache-trixiesha256:e25ab14ef2cfec3bab9dd66c6cf871691146f428fbd72241b1a2c38fcacf92f5
php:8.5.12-fpm-alpine3.24sha256:4943e6c8a08008605b470f6171d611a89384bac97188e4b0a7aefd3f793cd040

Tools: PIE 1.5.3, Composer 2.10.3, install-php-extensions at commit 611df5a7.

Test8.5.12 (3 images)8.6.0RC4 (3 images)
command -v pecl, command -v pearfoundnot found, exit 127
pecl install apcuexit 0pecl: not found, exit 127
php -r 'echo mb_strlen("é"), PHP_EOL;'1Call to undefined function mb_strlen(), exit 255
php -r 'echo PHP_ZTS;'prints nothing (NTS)1 (ZTS)
docker-php-ext-install mbstring, no extra packagesfails: oniguruma not foundfails: oniguruma not found
libonig-dev (Alpine: oniguruma-dev), then docker-php-ext-install mbstringbuildsbuilds, mb_strlen prints 1
install-php-extensions apcuinstallsUnsupported PHP version: 8.6, then pickle: Extension 'mbstring' required but not loaded
git and unzip installed, then pie install --no-interaction apcu/apcuapcu 5.1.28 loadedapcu 5.1.28 make fails
composer update --dry-run, laravel/framework ^12.0resolvesresolves through symfony/polyfill-mbstring
composer update --dry-run, symfony/console ^7.0resolvesresolves

Follow-up later on 22 October, on cli-trixie only, one run each:

Test8.5.128.6.0RC4
apcu 5.1.28 from pecl.php.net, phpize && ./configure && makebuildstoo many arguments to function 'php_verror'
phpredis 6.3.0, the same buildbuildsimplicit declaration of function 'zval_is_true', and others
pie install --no-interaction phpredis/phpredisnot runphpredis 6.3.0 make fails
libonig-dev, docker-php-ext-install mbstring, then install-php-extensions apcu and redisnot runmbstring loads; pickle: cannot access protected method Composer\Util\RemoteFilesystem::callbackGet(), 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:

ImageDigest
php:8.6.0RC4-cli-trixiesha256:2ec2a3449aaf35a555e99c0464ed8aced0ae1afd6db6792acb204296f3100e26
php:8.6.0RC4-cli-alpine3.24sha256:c9c90988b028655d7601a8d780ab5e068abd1c5f430cc0ee642755b94dd46583
php:8.6.0RC4-fpm-alpine3.24sha256:afd7a0a4339102708322d2d4ecc93e0831d493e362b2493375826239fcf86efe
php:8.5.12-cli-trixiesha256:acaa95199b53a1d7c346dddc7bcfc367ef3bd21ab832bd178eac7f043ed5396c

Tools: install-php-extensions 2.13.1 (sha256 3c3f3de26458405199f1f3a4c7130fdd2056daf596c05512badd769a77019b59), downloaded from its release page inside each container; PIE 1.5.3.

Test8.5.12 (cli-trixie)8.6.0RC4
install-php-extensions gd intl pdo_mysql zip bcmath mbstring opcacheexit 0, all loadexit 0, all load, on all three images; mb_strlen prints 1
install-php-extensions mongodbmongodb 2.5.5, exit 0mongodb 2.5.5, exit 0 (cli-trixie, cli-alpine3.24)
install-php-extensions uuid, then xhprof, then event, each in its own containernot runuuid 1.3.0, xhprof 2.3.10, event 3.1.6, each exit 0 (cli-trixie, cli-alpine3.24)
install-php-extensions apcunot runapcu 5.1.28 make fails: too many arguments to function 'php_verror', exit 1 (cli-trixie)
install-php-extensions redisnot runphpredis 6.3.0 make fails: implicit declaration of function 'XtOffsetOf', exit 1 (cli-trixie)
build packages with apt, then php pie.phar install mongodb/mongodb-extensionnot runmongodb 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.