Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package php-fpm8-image for openSUSE:Factory
checked in at 2026-09-19 22:22:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/php-fpm8-image (Old)
and /work/SRC/openSUSE:Factory/.php-fpm8-image.new.383539 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "php-fpm8-image"
Sat Sep 19 22:22:55 2026 rev:50 rq:1379017 version:unknown
Changes:
--------
--- /work/SRC/openSUSE:Factory/php-fpm8-image/php-fpm8-image.changes
2026-09-01 15:49:21.109839598 +0200
+++
/work/SRC/openSUSE:Factory/.php-fpm8-image.new.383539/php-fpm8-image.changes
2026-09-19 22:24:24.004756276 +0200
@@ -1,0 +2,5 @@
+Sat Sep 19 12:29:04 UTC 2026 - SUSE Update Bot <[email protected]>
+
+- introduce base and micro flavors for php
+
+-------------------------------------------------------------------
Old:
----
README.md
New:
----
Dockerfile.base
Dockerfile.micro
README.base.md
README.micro.md
_multibuild
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ Dockerfile ++++++
--- /var/tmp/diff_new_pack.2vDUJL/_old 2026-09-19 22:24:24.658783553 +0200
+++ /var/tmp/diff_new_pack.2vDUJL/_new 2026-09-19 22:24:24.660783636 +0200
@@ -1,104 +1,5 @@
-# SPDX-License-Identifier: MIT
+#!ExclusiveArch: do-not-build
+#!ForceMultiVersion
-# Copyright (c) 2026 SUSE LLC
-
-# All modifications and additions to the file contributed by third parties
-# remain the property of their copyright owners, unless otherwise agreed
-# upon.
-
-# The content of THIS FILE IS AUTOGENERATED and should not be manually
modified.
-# It is maintained by the BCI team and generated by
-# https://github.com/SUSE/BCI-dockerfile-generator
-
-# Please submit bugfixes or comments via https://bugs.opensuse.org/
-# You can contact the BCI team via https://github.com/SUSE/bci/discussions
-
-#!UseOBSRepositories
-
-#!BuildTag: opensuse/bci/php-fpm:%%php_version%%-%RELEASE%
-#!BuildTag: opensuse/bci/php-fpm:%%php_version%%
-#!BuildTag: opensuse/bci/php-fpm:8
-#!BuildTag: opensuse/bci/php-fpm:latest
-
-#!FilterBaseContainerPkgs
-FROM opensuse/tumbleweed:latest AS target
-FROM opensuse/tumbleweed:latest AS builder
-COPY --from=target / /target
-
-RUN set -euo pipefail; \
- export PERMCTL_ALLOW_INSECURE_MODE_IF_NO_PROC=1 SOURCE_DATE_EPOCH=0; \
- zypper -n --installroot /target --gpg-auto-import-keys install php8
php8-cli php-composer2 php8-curl php8-zip php8-zlib php8-phar php8-mbstring
php8-fpm
-
-COPY docker-php-source docker-php-entrypoint docker-php-ext-configure
docker-php-ext-enable docker-php-ext-install /target/usr/local/bin/
-RUN chmod +x /target/usr/local/bin/docker-php-*
-
-RUN set -euo pipefail; cd /target/etc/php8/fpm/; \
-test -e php-fpm.d/www.conf.default && cp -p php-fpm.d/www.conf.default
php-fpm.d/www.conf; \
-test -e php-fpm.conf.default && cp -p php-fpm.conf.default php-fpm.conf; \
-{ \
- echo '[global]'; \
- echo 'error_log = /proc/self/fd/2'; \
- echo; echo ';
https://github.com/docker-library/php/pull/725#issuecomment-443540114'; echo
'log_limit = 8192'; \
- echo; \
- echo '[www]'; \
- echo '; if we send this to /proc/self/fd/1, it never appears'; \
- echo 'access.log = /proc/self/fd/2'; \
- echo; \
- echo 'clear_env = no'; \
- echo; \
- echo '; Ensure worker stdout and stderr are sent to the main error log.'; \
- echo 'catch_workers_output = yes'; \
- echo 'decorate_workers_output = no'; \
-} | tee php-fpm.d/docker.conf; \
-{ \
- echo '[global]'; \
- echo 'daemonize = no'; \
-} | tee php-fpm.d/zz-docker.conf
-
-# cleanup logs and temporary files
-RUN set -euo pipefail; zypper -n --installroot /target clean -a; \
- t=$(mktemp -d); mv /target/usr/lib/sysimage/rpm/Packages.db $t; rpmdb
--rebuilddb --dbpath=$t; \
- rm /target/usr/lib/sysimage/rpm/*.db && install -m 0644 $t/Packages.db
/target/usr/lib/sysimage/rpm/; \
- rm -rf
{/target,}/var/log/{alternatives.log,lastlog,suseconnect.log,tallylog,zypper.log,zypp/history,YaST2};
\
- rm -rf {/target,}/run/{zypp.pid,regenerate-initrd,systemd}; \
- rm -f {/target,}/etc/{shadow-,group-,passwd-,.pwd.lock}; \
- rm -f {/target,}/usr/lib/sysimage/rpm/.rpm.lock; \
- rm -f {/target,}/var/lib/zypp/AnonymousUniqueId; \
- rm -f {/target,}/var/lib/zypp/AutoInstalled; \
- rm -f {/target,}/var/cache/ldconfig/aux-cache
-
-# set the day of last password change to empty
-RUN set -euo pipefail; sed -i 's/^\([^:]*:[^:]*:\)[^:]*\(:.*\)$/\1\2/'
/target/etc/shadow
-FROM opensuse/tumbleweed:latest
-COPY --from=builder /target /
-# Define labels according to
https://en.opensuse.org/Building_derived_containers
-# labelprefix=org.opensuse.bci.php-fpm
-LABEL org.opencontainers.image.title="openSUSE Tumbleweed BCI PHP-FPM 8"
-LABEL org.opencontainers.image.description="PHP-FPM 8 container based on the
openSUSE Tumbleweed Base Container Image."
-LABEL org.opencontainers.image.version="%%php_version%%"
-LABEL org.opencontainers.image.url="https://www.opensuse.org"
-LABEL org.opencontainers.image.created="%BUILDTIME%"
-LABEL org.opencontainers.image.vendor="openSUSE Project"
-LABEL org.opencontainers.image.source="%SOURCEURL%"
-LABEL org.opencontainers.image.ref.name="%%php_version%%-%RELEASE%"
-LABEL
org.opensuse.reference="registry.opensuse.org/opensuse/bci/php-fpm:%%php_version%%-%RELEASE%"
-LABEL org.openbuildservice.disturl="%DISTURL%"
-LABEL
org.opensuse.lifecycle-url="https://en.opensuse.org/Lifetime#openSUSE_BCI"
-LABEL org.opensuse.release-stage="released"
-# endlabelprefix
-LABEL io.artifacthub.package.readme-url="%SOURCEURL_WITH(README.md)%"
-ENV COMPOSER_VERSION="%%composer_version%%"
-ENV PHPIZE_DEPS="php8-devel awk make findutils"
-ENV PHP_INI_DIR="/etc/php8/"
-ENV PHP_VERSION="%%php_version%%"
-ENTRYPOINT ["docker-php-entrypoint"]
-CMD ["php-fpm"]
-
-WORKDIR /srv/www/htdocs
-
-# Override stop signal to stop process gracefully
-#
https://github.com/php/php-src/blob/17baa87faddc2550def3ae7314236826bc1b1398/sapi/fpm/php-fpm.8.in#L163
-STOPSIGNAL SIGQUIT
-
-EXPOSE 9000
+# For this container we only build the Dockerfile.$flavor builds.
++++++ Dockerfile.base ++++++
# SPDX-License-Identifier: MIT
# Copyright (c) 2026 SUSE LLC
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon.
# The content of THIS FILE IS AUTOGENERATED and should not be manually modified.
# It is maintained by the BCI team and generated by
# https://github.com/SUSE/BCI-dockerfile-generator
# Please submit bugfixes or comments via https://bugs.opensuse.org/
# You can contact the BCI team via https://github.com/SUSE/bci/discussions
#!UseOBSRepositories
#!BuildTag: opensuse/bci/php-fpm:%%php_version%%-base-%RELEASE%
#!BuildTag: opensuse/bci/php-fpm:%%php_version%%-base
#!BuildTag: opensuse/bci/php-fpm:8-base
#!BuildTag: opensuse/bci/php-fpm:8
#!BuildTag: opensuse/bci/php-fpm:latest
#!BcntSyncTag: php-fpm8-image
#!FilterBaseContainerPkgs
FROM opensuse/tumbleweed:latest AS target
FROM opensuse/tumbleweed:latest AS builder
COPY --from=target / /target
RUN set -euo pipefail; \
export PERMCTL_ALLOW_INSECURE_MODE_IF_NO_PROC=1 SOURCE_DATE_EPOCH=0; \
zypper -n --installroot /target --gpg-auto-import-keys install php8
php8-cli php-composer2 php8-curl php8-zip php8-zlib php8-phar php8-mbstring
php8-fpm
COPY docker-php-source docker-php-entrypoint docker-php-ext-configure
docker-php-ext-enable docker-php-ext-install /target/usr/local/bin/
RUN chmod +x /target/usr/local/bin/docker-php-*
RUN set -euo pipefail; cd /target/etc/php8/fpm/; \
test -e php-fpm.d/www.conf.default && cp -p php-fpm.d/www.conf.default
php-fpm.d/www.conf; \
test -e php-fpm.conf.default && cp -p php-fpm.conf.default php-fpm.conf; \
{ \
echo '[global]'; \
echo 'error_log = /proc/self/fd/2'; \
echo; echo ';
https://github.com/docker-library/php/pull/725#issuecomment-443540114'; echo
'log_limit = 8192'; \
echo; \
echo '[www]'; \
echo '; if we send this to /proc/self/fd/1, it never appears'; \
echo 'access.log = /proc/self/fd/2'; \
echo; \
echo 'clear_env = no'; \
echo; \
echo '; Ensure worker stdout and stderr are sent to the main error log.'; \
echo 'catch_workers_output = yes'; \
echo 'decorate_workers_output = no'; \
} | tee php-fpm.d/docker.conf; \
{ \
echo '[global]'; \
echo 'daemonize = no'; \
} | tee php-fpm.d/zz-docker.conf
# cleanup logs and temporary files
RUN set -euo pipefail; zypper -n --installroot /target clean -a; \
t=$(mktemp -d); mv /target/usr/lib/sysimage/rpm/Packages.db $t; rpmdb
--rebuilddb --dbpath=$t; \
rm /target/usr/lib/sysimage/rpm/*.db && install -m 0644 $t/Packages.db
/target/usr/lib/sysimage/rpm/; \
rm -rf
{/target,}/var/log/{alternatives.log,lastlog,suseconnect.log,tallylog,zypper.log,zypp/history,YaST2};
\
rm -rf {/target,}/run/{zypp.pid,regenerate-initrd,systemd}; \
rm -f {/target,}/etc/{shadow-,group-,passwd-,.pwd.lock}; \
rm -f {/target,}/usr/lib/sysimage/rpm/.rpm.lock; \
rm -f {/target,}/var/lib/zypp/AnonymousUniqueId; \
rm -f {/target,}/var/lib/zypp/AutoInstalled; \
rm -f {/target,}/var/cache/ldconfig/aux-cache
# set the day of last password change to empty
RUN set -euo pipefail; sed -i 's/^\([^:]*:[^:]*:\)[^:]*\(:.*\)$/\1\2/'
/target/etc/shadow
FROM opensuse/tumbleweed:latest
COPY --from=builder /target /
# Define labels according to https://en.opensuse.org/Building_derived_containers
# labelprefix=org.opensuse.bci.php-fpm
LABEL org.opencontainers.image.title="openSUSE Tumbleweed BCI PHP-FPM 8
development"
LABEL org.opencontainers.image.description="PHP-FPM 8 development container
based on the openSUSE Tumbleweed Base Container Image."
LABEL org.opencontainers.image.version="%%php_version%%"
LABEL org.opencontainers.image.url="https://www.opensuse.org"
LABEL org.opencontainers.image.created="%BUILDTIME%"
LABEL org.opencontainers.image.vendor="openSUSE Project"
LABEL org.opencontainers.image.source="%SOURCEURL%"
LABEL org.opencontainers.image.ref.name="%%php_version%%-base-%RELEASE%"
LABEL
org.opensuse.reference="registry.opensuse.org/opensuse/bci/php-fpm:%%php_version%%-base-%RELEASE%"
LABEL org.openbuildservice.disturl="%DISTURL%"
LABEL org.opensuse.lifecycle-url="https://en.opensuse.org/Lifetime#openSUSE_BCI"
LABEL org.opensuse.release-stage="released"
# endlabelprefix
LABEL io.artifacthub.package.readme-url="%SOURCEURL_WITH(README.base.md)%"
ENV COMPOSER_VERSION="%%composer_version%%"
ENV PHPIZE_DEPS="php8-devel awk make findutils"
ENV PHP_INI_DIR="/etc/php8/"
ENV PHP_VERSION="%%php_version%%"
ENTRYPOINT ["docker-php-entrypoint"]
CMD ["php-fpm"]
WORKDIR /srv/www/htdocs
# Override stop signal to stop process gracefully
#
https://github.com/php/php-src/blob/17baa87faddc2550def3ae7314236826bc1b1398/sapi/fpm/php-fpm.8.in#L163
STOPSIGNAL SIGQUIT
EXPOSE 9000
++++++ Dockerfile.micro ++++++
# SPDX-License-Identifier: MIT
# Copyright (c) 2026 SUSE LLC
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon.
# The content of THIS FILE IS AUTOGENERATED and should not be manually modified.
# It is maintained by the BCI team and generated by
# https://github.com/SUSE/BCI-dockerfile-generator
# Please submit bugfixes or comments via https://bugs.opensuse.org/
# You can contact the BCI team via https://github.com/SUSE/bci/discussions
#!UseOBSRepositories
#!BuildTag: opensuse/bci/php-fpm:%%php_version%%-micro-%RELEASE%
#!BuildTag: opensuse/bci/php-fpm:%%php_version%%-micro
#!BuildTag: opensuse/bci/php-fpm:8-micro
#!BcntSyncTag: php-fpm8-image
#!FilterBaseContainerPkgs
FROM opensuse/bci/bci-micro:latest AS target
FROM opensuse/tumbleweed:latest AS builder
COPY --from=target / /target
RUN set -euo pipefail; \
export PERMCTL_ALLOW_INSECURE_MODE_IF_NO_PROC=1 SOURCE_DATE_EPOCH=0; \
zypper -n --installroot /target --gpg-auto-import-keys install php8
php8-cli php-composer2 php8-curl php8-zip php8-zlib php8-phar php8-mbstring
php8-fpm
COPY docker-php-source docker-php-entrypoint docker-php-ext-configure
docker-php-ext-enable docker-php-ext-install /target/usr/local/bin/
RUN chmod +x /target/usr/local/bin/docker-php-*
RUN set -euo pipefail; cd /target/etc/php8/fpm/; \
test -e php-fpm.d/www.conf.default && cp -p php-fpm.d/www.conf.default
php-fpm.d/www.conf; \
test -e php-fpm.conf.default && cp -p php-fpm.conf.default php-fpm.conf; \
{ \
echo '[global]'; \
echo 'error_log = /proc/self/fd/2'; \
echo; echo ';
https://github.com/docker-library/php/pull/725#issuecomment-443540114'; echo
'log_limit = 8192'; \
echo; \
echo '[www]'; \
echo '; if we send this to /proc/self/fd/1, it never appears'; \
echo 'access.log = /proc/self/fd/2'; \
echo; \
echo 'clear_env = no'; \
echo; \
echo '; Ensure worker stdout and stderr are sent to the main error log.'; \
echo 'catch_workers_output = yes'; \
echo 'decorate_workers_output = no'; \
} | tee php-fpm.d/docker.conf; \
{ \
echo '[global]'; \
echo 'daemonize = no'; \
} | tee php-fpm.d/zz-docker.conf
# cleanup logs and temporary files
RUN set -euo pipefail; zypper -n --installroot /target clean -a; \
t=$(mktemp -d); mv /target/usr/lib/sysimage/rpm/Packages.db $t; rpmdb
--rebuilddb --dbpath=$t; \
rm /target/usr/lib/sysimage/rpm/*.db && install -m 0644 $t/Packages.db
/target/usr/lib/sysimage/rpm/; \
rm -rf
{/target,}/var/log/{alternatives.log,lastlog,suseconnect.log,tallylog,zypper.log,zypp/history,YaST2};
\
rm -rf {/target,}/run/{zypp.pid,regenerate-initrd,systemd}; \
rm -f {/target,}/etc/{shadow-,group-,passwd-,.pwd.lock}; \
rm -f {/target,}/usr/lib/sysimage/rpm/.rpm.lock; \
rm -f {/target,}/var/lib/zypp/AnonymousUniqueId; \
rm -f {/target,}/var/lib/zypp/AutoInstalled; \
rm -f {/target,}/var/cache/ldconfig/aux-cache
# set the day of last password change to empty
RUN set -euo pipefail; sed -i 's/^\([^:]*:[^:]*:\)[^:]*\(:.*\)$/\1\2/'
/target/etc/shadow
FROM opensuse/bci/bci-micro:latest
COPY --from=builder /target /
# Define labels according to https://en.opensuse.org/Building_derived_containers
# labelprefix=org.opensuse.bci.php-fpm
LABEL org.opencontainers.image.title="openSUSE Tumbleweed BCI PHP-FPM 8 runtime"
LABEL org.opencontainers.image.description="PHP-FPM 8 runtime container based
on the openSUSE Tumbleweed Base Container Image."
LABEL org.opencontainers.image.version="%%php_version%%"
LABEL org.opencontainers.image.url="https://www.opensuse.org"
LABEL org.opencontainers.image.created="%BUILDTIME%"
LABEL org.opencontainers.image.vendor="openSUSE Project"
LABEL org.opencontainers.image.source="%SOURCEURL%"
LABEL org.opencontainers.image.ref.name="%%php_version%%-micro-%RELEASE%"
LABEL
org.opensuse.reference="registry.opensuse.org/opensuse/bci/php-fpm:%%php_version%%-micro-%RELEASE%"
LABEL org.openbuildservice.disturl="%DISTURL%"
LABEL org.opensuse.lifecycle-url="https://en.opensuse.org/Lifetime#openSUSE_BCI"
LABEL org.opensuse.release-stage="released"
# endlabelprefix
LABEL io.artifacthub.package.readme-url="%SOURCEURL_WITH(README.micro.md)%"
ENV COMPOSER_VERSION="%%composer_version%%"
ENV PHPIZE_DEPS="php8-devel awk make findutils"
ENV PHP_INI_DIR="/etc/php8/"
ENV PHP_VERSION="%%php_version%%"
ENTRYPOINT ["docker-php-entrypoint"]
CMD ["php-fpm"]
WORKDIR /srv/www/htdocs
# Override stop signal to stop process gracefully
#
https://github.com/php/php-src/blob/17baa87faddc2550def3ae7314236826bc1b1398/sapi/fpm/php-fpm.8.in#L163
STOPSIGNAL SIGQUIT
EXPOSE 9000
++++++ README.base.md ++++++
# The PHP FPM 8 container image

PHP is a general-purpose scripting language used primarily for server-side web
development. It can be used directly, embedded in HTML files, or executed via a
server-side Apache2 module or CGI scripts.
## How to use the image
The image contains [PHP-FPM](https://php-fpm.org/), a FastCGI implementation
for PHP that serves content via the FastCGI protocol and not via HTTP(S). This
requires a reverse proxy that can handle FastCGI and can serve content via
HTTP(s).
**Caution:** FastCGI does not offer any protection or access control, so the
open socket must be protected via network separation. This means that the
PHP-FPM container must run in a separate private network or a pod, and its
socket must be exposed to the reverse proxy only.
To deploy an application in the PHP-FPM container, copy the application into
`/srv/www/htdocs` (this directory is the `WORKDIR` of the container image):
```Dockerfile
FROM registry.opensuse.org/opensuse/bci/php-fpm:8-base
RUN set -eux; \
zypper -n install $my_dependencies; \
# additional setup steps
# Copy the app into the PHP-FPM document root
COPY app/ .
```
To configure NGINX as a reverse proxy, add the following to the
`server` section in `/etc/nginx/nginx.conf`:
```
location ~ \.php$ {
include fastcgi_params;
fastcgi_index index.php;
root /srv/www/htdocs/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
```
Additionally, create `/etc/nginx/fastcgi_params` with the following contents:
```
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
```
If you are using a NGINX container with the above changes, you can
use a Podman pod to deploy the application:
```ShellSession
$ podman pod create --name fpm -p 80:8080
$ podman run -d --pod fpm name-of-my-fpm-container
$ podman run -d --pod fpm name-of-my-nginx-container
```
The website is served on port 8080, and the FastCGI application is not
accessible from outside of the `fpm` pod.
## How to install PHP extensions
PHP extensions must be installed using the `zypper` package manager. PHP
extensions are named using the `php8-$extension_name` scheme,
and they can be installed as follows:
```Dockerfile
FROM registry.opensuse.org/opensuse/bci/php-fpm:8-base
RUN zypper -n install php8-gd php8-intl
```
Alternatively, you can use the `docker-php-ext-install` script. It is provided
for compatibility with the [PHP DockerHub Image](https://hub.docker.com/_/php)
but it uses zypper to install the extensions from RPMs. It is provided for
compatibility reasons and can be used similar to the script from PHP DockerHub
image:
```Dockerfile
FROM registry.opensuse.org/opensuse/bci/php-fpm:8-base
RUN docker-php-ext-install gd intl
```
## How to install PECL extensions
[PECL](https://pecl.php.net/) is a package repository hosting PHP extensions. It
can be used as an alternative source to obtain PHP extensions, but without any
guarantee of interoperability with this image and without any official support.
Install PECL extensions as follows:
```Dockerfile
FROM registry.opensuse.org/opensuse/bci/php-fpm:8-base
RUN set -euo pipefail; \
zypper -n install $PHPIZE_DEPS php8-pecl; \
pecl install APCu-5.1.21;
```
**Note:** Building an extension may require installing its dependencies first.
## Compatibility with the DockerHub Image
The following scripts ship with the image to keep it compatible with the
DockerHub image: `docker-php-source`, `docker-php-ext-configure`,
`docker-php-ext-enable`, and `docker-php-ext-install`.
The script `docker-php-ext-install` performs an actual job, all others are
just no-operation scripts for interoperability.
## Licensing
`SPDX-License-Identifier: MIT`
This documentation and the build recipe are licensed as MIT.
The container itself contains various software components under various open
source licenses listed in the associated
Software Bill of Materials (SBOM).
This image is based on [openSUSE
Tumbleweed](https://get.opensuse.org/tumbleweed/).
++++++ README.micro.md ++++++
# The PHP FPM 8 container image

PHP is a general-purpose scripting language used primarily for server-side web
development. It can be used directly, embedded in HTML files, or executed via a
server-side Apache2 module or CGI scripts.
## How to use the image
The image contains [PHP-FPM](https://php-fpm.org/), a FastCGI implementation
for PHP that serves content via the FastCGI protocol and not via HTTP(S). This
requires a reverse proxy that can handle FastCGI and can serve content via
HTTP(s).
**Caution:** FastCGI does not offer any protection or access control, so the
open socket must be protected via network separation. This means that the
PHP-FPM container must run in a separate private network or a pod, and its
socket must be exposed to the reverse proxy only.
To deploy an application in the PHP-FPM container, copy the application into
`/srv/www/htdocs` (this directory is the `WORKDIR` of the container image):
```Dockerfile
FROM registry.opensuse.org/opensuse/bci/php-fpm:8-micro
RUN set -eux; \
zypper -n install $my_dependencies; \
# additional setup steps
# Copy the app into the PHP-FPM document root
COPY app/ .
```
To configure NGINX as a reverse proxy, add the following to the
`server` section in `/etc/nginx/nginx.conf`:
```
location ~ \.php$ {
include fastcgi_params;
fastcgi_index index.php;
root /srv/www/htdocs/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
```
Additionally, create `/etc/nginx/fastcgi_params` with the following contents:
```
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
```
If you are using a NGINX container with the above changes, you can
use a Podman pod to deploy the application:
```ShellSession
$ podman pod create --name fpm -p 80:8080
$ podman run -d --pod fpm name-of-my-fpm-container
$ podman run -d --pod fpm name-of-my-nginx-container
```
The website is served on port 8080, and the FastCGI application is not
accessible from outside of the `fpm` pod.
## How to install PHP extensions
PHP extensions must be installed using the `zypper` package manager. PHP
extensions are named using the `php8-$extension_name` scheme,
and they can be installed as follows:
```Dockerfile
FROM registry.opensuse.org/opensuse/bci/php-fpm:8-micro
RUN zypper -n install php8-gd php8-intl
```
Alternatively, you can use the `docker-php-ext-install` script. It is provided
for compatibility with the [PHP DockerHub Image](https://hub.docker.com/_/php)
but it uses zypper to install the extensions from RPMs. It is provided for
compatibility reasons and can be used similar to the script from PHP DockerHub
image:
```Dockerfile
FROM registry.opensuse.org/opensuse/bci/php-fpm:8-micro
RUN docker-php-ext-install gd intl
```
## How to install PECL extensions
[PECL](https://pecl.php.net/) is a package repository hosting PHP extensions. It
can be used as an alternative source to obtain PHP extensions, but without any
guarantee of interoperability with this image and without any official support.
Install PECL extensions as follows:
```Dockerfile
FROM registry.opensuse.org/opensuse/bci/php-fpm:8-micro
RUN set -euo pipefail; \
zypper -n install $PHPIZE_DEPS php8-pecl; \
pecl install APCu-5.1.21;
```
**Note:** Building an extension may require installing its dependencies first.
## Compatibility with the DockerHub Image
The following scripts ship with the image to keep it compatible with the
DockerHub image: `docker-php-source`, `docker-php-ext-configure`,
`docker-php-ext-enable`, and `docker-php-ext-install`.
The script `docker-php-ext-install` performs an actual job, all others are
just no-operation scripts for interoperability.
## Licensing
`SPDX-License-Identifier: MIT`
This documentation and the build recipe are licensed as MIT.
The container itself contains various software components under various open
source licenses listed in the associated
Software Bill of Materials (SBOM).
This image is based on [openSUSE
Tumbleweed](https://get.opensuse.org/tumbleweed/).
++++++ _multibuild ++++++
<multibuild>
<package>base</package>
<package>micro</package>
</multibuild>
(No newline at EOF)
++++++ _service ++++++
--- /var/tmp/diff_new_pack.2vDUJL/_old 2026-09-19 22:24:24.786788891 +0200
+++ /var/tmp/diff_new_pack.2vDUJL/_new 2026-09-19 22:24:24.789789016 +0200
@@ -2,12 +2,22 @@
<service mode="buildtime" name="docker_label_helper"/>
<service mode="buildtime" name="kiwi_metainfo_helper"/>
<service mode="buildtime" name="replace_using_package_version">
- <param name="file">Dockerfile</param>
+ <param name="file">Dockerfile.base</param>
<param name="regex">%%composer_version%%</param>
<param name="package">php-composer2</param>
</service>
<service mode="buildtime" name="replace_using_package_version">
- <param name="file">Dockerfile</param>
+ <param name="file">Dockerfile.base</param>
+ <param name="regex">%%php_version%%</param>
+ <param name="package">php8</param>
+ </service>
+ <service mode="buildtime" name="replace_using_package_version">
+ <param name="file">Dockerfile.micro</param>
+ <param name="regex">%%composer_version%%</param>
+ <param name="package">php-composer2</param>
+ </service>
+ <service mode="buildtime" name="replace_using_package_version">
+ <param name="file">Dockerfile.micro</param>
<param name="regex">%%php_version%%</param>
<param name="package">php8</param>
</service>