These options and tools are part of the images but do not work, or work only in some images. The rest of the documentation leaves them out. Each entry says what happens, which images are affected and what to do instead. Where a GitHub issue already exists, it is linked.
- Effect: Always prints its usage text and exits with code 1, also for a valid call such as
docker-php-setting memory_limit 512M. The setting is not changed. - Images:
php-*, Debian and Alpine. - Instead: Set
php.<key>or a shortcut such asPHP_MEMORY_LIMIT, see PHP, or replacephp.ini.
- Effect: No effect. The value is passed to
postfix start, which ignores it. - Images: all images with Postfix:
base,base-app,nginx,apache,php-*. - Instead: Change the Postfix configuration with
postconf -ein a service hook in/opt/docker/bin/service.d/postfix.d/, or usePOSTFIX_RELAYHOSTandPOSTFIX_MYNETWORKS.
- Effect: Any value other than
rootmakes the container exit with code 2 right after the start: supervisord switches to that user and then cannot create its control socket/.supervisor.sock(Cannot open an HTTP server: … EACCES). - Images: all images except
bootstrapandtoolbox. - Instead: Leave it unset. PHP-FPM runs its workers as
applicationanyway.
- Effect: With
PHP_DEBUGGER=blackfire, supervisord starts theblackfire-agentservice, but the agent is not installed. It exits with code 127 and is restarted over and over, which fills the container log. The Blackfire PHP extension itself is loaded. - Images:
php-dev,php-nginx-dev,php-apache-dev. - Instead: Run the agent in its own container and point the extension at it with
php.blackfire.agent_socket, for exampletcp://blackfire:8307. The restart loop in the log remains. - Issue: #529 (closed, still reproducible).
- Effect: Fails with
APPLICATION_USER: unbound variable. - Images:
base,nginx,apache. It works inbase-appandphp-*. - Instead: Set
APPLICATION_USER, for example toroot, or run the command directly; any other command runs asroot, see Commands.
-
Effect: Fails.
/etc/cron.ddoes not exist, and BusyBoxcronddoes not read it. -
Images: all Alpine images.
-
Instead: Add the job to
/etc/crontabs/root, without the user column. In images that do not start cron by default, also rundocker-service enable cron.RUN echo '*/5 * * * * /usr/local/bin/php /app/bin/console app:cleanup' >> /etc/crontabs/root
-
Issue: related question #280.
- Effect: Exits with code 1 (
find: /var/lib/apk/: No such file or directory), soRUN apk-install … && docker-image-cleanupfails the build. - Images: the
-alpinetags ofphp-*. It works inbase:alpine. - Instead: Leave it out;
apk-installkeeps no package cache.
-
Effect: Only the Debian component
mainis enabled. The image build tries to addcontribandnon-free, but itssedcommand expects the one-linesources.listformat, while Debian 12 lists its sources in/etc/apt/sources.list.d/debian.sources. Packages fromcontribornon-free, for exampleunrarorttf-mscorefonts-installer, cannot be installed. -
Images:
php-*with the Debian tags8.2to8.5. -
Instead: Enable the components in your Dockerfile:
FROM webdevops/php:8.5 RUN sed -i 's/^Components: main$/Components: main contrib non-free/' /etc/apt/sources.list.d/debian.sources \ && apt-install unrar
- Effect:
/etc/apk/repositoriesalso lists the community repository of Alpine 3.20 (https://dl-4.alpinelinux.org/alpine/v3.20/community/), although the images are based on a newer Alpine release, for example 3.24 in8.5-alpine.apkreads that index too, so a package that is missing from the current release can be installed from Alpine 3.20, built against older libraries. - Images:
php-*with the Alpine tags8.2-alpineto8.5-alpine. - Instead: Remove the line in your Dockerfile before you install packages:
RUN sed -i '/\/v3\.20\//d' /etc/apk/repositories.
- Effect:
/etc/apt/sources.listholds only the nginx.org repository and ends without a line break. A line appended withecho "deb ..." >> /etc/apt/sources.listis joined to the last line: apt ignores the new repository and only prints warnings such ascomponent misspelt in sources.list. The nginx.org key is stored in the deprecated global keyring/etc/apt/trusted.gpg, which apt trusts for every repository;apt-get updatewarns about it. - Images:
php-nginxandphp-nginx-devwith the Debian tags8.2to8.5. - Instead: Add your own repositories as a new file in
/etc/apt/sources.list.d/, for exampleecho "deb http://deb.debian.org/debian bookworm-backports main" > /etc/apt/sources.list.d/backports.list.
- Effect: When an
XDEBUG_*variable is set, the development images append its setting to/opt/docker/etc/php/php.ini, your own file. A read-write mount gets one more line on every start of the container, also on the host; with a:romount the container exits at start. - Images:
php-dev,php-nginx-dev,php-apache-dev. - Instead: Set the Xdebug directives in your
php.inior withphp.xdebug.<key>instead of theXDEBUG_*variables. Or bring yourphp.iniin withCOPY; then only the copy inside the container is changed.
- Effect: No effect for
listen,access.log,clear_env,catch_workers_outputanddecorate_workers_output. The official PHP image sets them in the pool filedocker.conf, which PHP-FPM reads afterapplication.conf, so its values win. Other directives work, for examplefpm.pool.pm.max_requests. - Images:
php-*, Debian and Alpine. - Instead: Add a pool file whose name sorts after
docker.conf, for examplezz-pool.confwith a[www]section, to/opt/docker/etc/php/fpm/pool.d/.
- Effect: Only the first
*.entry becomes a wildcard for dnsmasq; further wildcard entries are dropped. - Images: all images with dnsmasq.
- Instead: Use one wildcard entry.
- Effect: The self-signed certificate for
*.vmon port 443 expired on 2025-05-01. - Images:
php-nginx,php-nginx-dev,php-apache,php-apache-dev,nginx,apache. - Instead: Mount your own
server.crtandserver.key, see Configuration files.
- Effect: The
alpinetags ofbootstrap,base,base-app,nginxandapacheare built on Alpine 3.11, which has been out of support since November 2021, with Nginx 1.16.1 and Apache 2.4.51. - Images:
bootstrap:alpine,base:alpine,base-app:alpine,nginx:alpine,apache:alpine. The Alpine variants of the PHP images are not affected; they use the Alpine release of the official PHP image. - Instead: Use the
ubuntu-22.04tags, or a PHP image. - Issue: #453 (closed, still applies).
- Effect: The CI no longer builds these tags, but they are still on Docker Hub. An image used without a tag, for example
image: webdevops/php-nginx, is thelatestimage from April 2020 and gets no updates. Thealpinetags are from April 2020 as well, those of the development images from April 2019. - Images:
php,php-dev,php-nginx,php-nginx-dev,php-apache,php-apache-dev. - Instead: Always use a version tag such as
8.5or8.5-alpine.
- Effect: The SSH server runs, but the accounts have no password, so nobody can log in. Only
php-devsets the passworddev. - Images:
php-nginx-dev,php-apache-dev. - Instead: Use
docker compose exec.
- Effect: With
COMPOSER_VERSION=1, every Composer run prints deprecation notices. - Images:
php-*with PHP 8.4 and 8.5. - Instead: Use Composer 2, the default.
XDEBUG_REMOTE_*,XDEBUG_IDE_KEY,XDEBUG_MAX_NESTING_LEVELandXDEBUG_PROFILER_*are ignored; they belong to Xdebug 2. Set the Xdebug 3 directive withphp.xdebug.<key>instead, for examplephp.xdebug.max_nesting_level: "500"orphp.xdebug.idekey: PHPSTORM. The variables listed under Development images still work.SERVICE_BLACKFIRE_AGENT_OPTShas no effect, because the agent is not installed (see Blackfire agent).- Tags that are no longer built stay on Docker Hub without updates: PHP 5.6 to 8.1 and all operating system tags such as
debian-9orubuntu-18.04. Forlatestandalpine, see above. - The images
webdevops/storage,webdevops/vsftpandwebdevops/sshare no longer built. Their last images stay on Docker Hub without updates (sshsince December 2022). For replacements, see Replacing discontinued images. - The Ansible provisioning is removed:
docker-provision,docker-ansible-install,/opt/docker/bin/provisionand theprovision.role*commands of/opt/docker/bin/control.sh. They needed Python 2 and Ansible packages that no longer exist and did not work in any image./opt/docker/provision/onbuild.dis removed too; scripts in it were never run. Use shell scripts inbootstrap.dorbuild.d, see Scripts at image build.