PHP containers that are pinned, hardened and small.

Alpine-based images for PHP 8.2 to 8.6 on amd64 and arm64. Every release is pinned, every image is scanned before it is published, and nothing runs as root unless you ask it to.

Terminal
docker run --rm -d -p 8080:8080 \
  -e NGINX_PORT=8080 \
  -v $(pwd):/var/www/html:ro \
  adamrollogi/php-nginx:8.4

Four images, one lineage

Each image builds on the one before it, so behaviour is consistent from the CLI to the full web stack.

    base

    Alpine 3.24 with tini, Supervisor, bash, curl, git and the shared logging helpers. The foundation for everything else.

    php

    PHP CLI with Composer and the extensions a modern framework needs. One tag per minor and one per exact release.

    php-nginx

    Nginx and PHP-FPM under one roof, with optional HTTPS, security headers, a health endpoint and per-service logs.

    php-nginx-dev

    The web stack plus Xdebug, visible errors and uncached assets, tuned for local development.

    Pinned releases

    The exact PHP release is pinned per minor and enforced at build time. New upstream releases are picked up automatically every four hours.

    Hardened defaults

    Non-root, no setuid binaries, root-owned config, read-only rootfs support, and Trivy scans gating every publish.

Everything is configured with environment variables

No Dockerfile layering needed for the common cases. Set a variable, restart the container, done.