# # Taken from the official PHP image's Dockerfile # (https://github.com/docker-library/php/tree/5c037abaf9dc0095e29807c048d9d1b97e6a9716/8.1/alpine3.21/cli), # with the changes marked "chialab:". # # chialab: deb.sury.org's patches for this version, from the Salsa commit of the build named in PHP_PATCHES. FROM scratch AS deb-patches ARG DEB_PATCHES=https://salsa.debian.org/php-team/php/-/archive/4e430ad99622d9fabcee27d6dba438c81de716eb/php-4e430ad99622d9fabcee27d6dba438c81de716eb.tar.gz?path=debian/patches ADD --unpack=true $DEB_PATCHES / FROM alpine:3.21 # dependencies required for running "phpize" # these get automatically installed and removed by "docker-php-ext-*" (unless they're already installed) ENV PHPIZE_DEPS \ autoconf \ dpkg-dev dpkg \ file \ g++ \ gcc \ libc-dev \ make \ pkgconf \ re2c # persistent / runtime deps RUN apk add --no-cache \ ca-certificates \ curl \ openssl \ tar \ xz # ensure www-data user exists RUN set -eux; \ adduser -u 82 -D -S -G www-data www-data # 82 is the standard uid/gid for "www-data" in Alpine # https://git.alpinelinux.org/aports/tree/main/apache2/apache2.pre-install?h=3.14-stable # https://git.alpinelinux.org/aports/tree/main/lighttpd/lighttpd.pre-install?h=3.14-stable # https://git.alpinelinux.org/aports/tree/main/nginx/nginx.pre-install?h=3.14-stable ENV PHP_INI_DIR /usr/local/etc/php RUN set -eux; \ mkdir -p "$PHP_INI_DIR/conf.d"; \ # allow running as an arbitrary user (https://github.com/docker-library/php/issues/743) [ ! -d /var/www/html ]; \ mkdir -p /var/www/html; \ chown www-data:www-data /var/www/html; \ chmod 1777 /var/www/html # Apply stack smash protection to functions using local buffers and alloca() # Make PHP's main executable position-independent (improves ASLR security mechanism, and has no performance impact on x86_64) # Enable optimization (-O2) # Enable linker optimization (this sorts the hash buckets to improve cache locality, and is non-default) # https://github.com/docker-library/php/issues/272 # -D_LARGEFILE_SOURCE and -D_FILE_OFFSET_BITS=64 (https://www.php.net/manual/en/intro.filesystem.php) ENV PHP_CFLAGS="-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" ENV PHP_CPPFLAGS="$PHP_CFLAGS" ENV PHP_LDFLAGS="-Wl,-O1 -pie" ENV GPG_KEYS 528995BFEDFBA7191D46839EF9BA0ADA31CBD89E 39B641343D8C104B2B146DC3F9C39DC0B9698544 F1F692238FBC1666E5A5CCD4199F9DFEF6FFBAFD ENV PHP_VERSION 8.1.34 ENV PHP_URL="https://www.php.net/distributions/php-8.1.34.tar.xz" PHP_ASC_URL="https://www.php.net/distributions/php-8.1.34.tar.xz.asc" ENV PHP_SHA256="ffa9e0982e82eeaea848f57687b425ed173aa278fe563001310ae2638db5c251" RUN set -eux; \ \ apk add --no-cache --virtual .fetch-deps gnupg; \ \ mkdir -p /usr/src; \ cd /usr/src; \ \ curl -fsSL -o php.tar.xz "$PHP_URL"; \ \ if [ -n "$PHP_SHA256" ]; then \ echo "$PHP_SHA256 *php.tar.xz" | sha256sum -c -; \ fi; \ \ curl -fsSL -o php.tar.xz.asc "$PHP_ASC_URL"; \ export GNUPGHOME="$(mktemp -d)"; \ for key in $GPG_KEYS; do \ gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \ done; \ gpg --batch --verify php.tar.xz.asc php.tar.xz; \ gpgconf --kill all; \ rm -rf "$GNUPGHOME"; \ \ apk del --no-network .fetch-deps # chialab: helper scripts are added from the source commit. ARG DOCKER_PHP_SCRIPTS=https://raw.githubusercontent.com/docker-library/php/5c037abaf9dc0095e29807c048d9d1b97e6a9716/8.1/alpine3.21/cli ADD --chmod=755 $DOCKER_PHP_SCRIPTS/docker-php-source /usr/local/bin/ # chialab: security backports for this EOL version (see eol/patches). ENV PHP_PATCHES="deb.sury.org-8.1.34-9" LABEL it.chialab.php.patches="deb.sury.org-8.1.34-9" RUN --mount=type=bind,from=deb-patches,target=/usr/src/deb-patches \ --mount=type=bind,from=patches,source=series.8.1,target=/usr/src/php-series \ --mount=type=bind,from=patches,source=docker-php-source-patch,target=/usr/local/bin/docker-php-source-patch \ docker-php-source-patch /usr/src/php-series /usr/src/deb-patches RUN set -eux; \ apk add --no-cache --virtual .build-deps \ $PHPIZE_DEPS \ argon2-dev \ coreutils \ curl-dev \ gnu-libiconv-dev \ libsodium-dev \ libxml2-dev \ linux-headers \ oniguruma-dev \ openssl-dev \ patch \ patchutils \ readline-dev \ sqlite-dev \ ; \ \ # make sure musl's iconv doesn't get used (https://www.php.net/manual/en/intro.iconv.php) rm -vf /usr/include/iconv.h; \ \ export \ CFLAGS="$PHP_CFLAGS" \ CPPFLAGS="$PHP_CPPFLAGS" \ LDFLAGS="$PHP_LDFLAGS" \ # https://github.com/php/php-src/blob/d6299206dd828382753453befd1b915491b741c6/configure.ac#L1496-L1511 PHP_BUILD_PROVIDER='https://github.com/docker-library/php' \ PHP_UNAME='Linux - Docker' \ ; \ docker-php-source extract; \ cd /usr/src/php; \ # Apply patches; see https://github.com/docker-library/php/pull/1552 # https://github.com/php/php-src/issues/11678 curl -fL 'https://github.com/php/php-src/commit/577b8ae4226368e66fee7a9b5c58f9e2428372fc.patch?full_index=1' -o 11678.patch; \ echo '6edc20c3bb3e7cc13515abce7f2fffa8ebea6cf7469abfbc78fcdc120350b239 *11678.patch' | sha256sum -c -; \ patch -p1 < 11678.patch; \ rm 11678.patch; \ # https://github.com/php/php-src/pull/19131 # this backported commit broke our ability to apply 14834, which is the fix we need, so this is applied as a reverse patch to undo it # 19131 was for FreeBSD, so doesn't apply to this alpine build curl -fL 'https://github.com/php/php-src/commit/a5df26691d1b1f71b964b869510473a5d5413999.patch?full_index=1' -o 19131.patch; \ echo 'c98c01c74d3a6da197116f8511b16fed361ca6bbb6a8af8df629a933f541c213 *19131.patch' | sha256sum -c -; \ patch --reverse -p1 < 19131.patch; \ rm 19131.patch; \ # https://github.com/php/php-src/issues/14834 curl -fL 'https://github.com/php/php-src/commit/67259e451d5d58b4842776c5696a66d74e157609.patch?full_index=1' -o 14834.patch; \ echo 'ed10a1b254091ad676ed204e55628ecbd6c8962004d6185a1821cedecd526c0f *14834.patch' | sha256sum -c -; \ filterdiff -x '*/NEWS' 14834.patch | patch -p1; \ rm 14834.patch; \ gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \ ./configure \ --build="$gnuArch" \ --with-config-file-path="$PHP_INI_DIR" \ --with-config-file-scan-dir="$PHP_INI_DIR/conf.d" \ \ # make sure invalid --configure-flags are fatal errors instead of just warnings --enable-option-checking=fatal \ \ # https://github.com/docker-library/php/issues/439 --with-mhash \ \ # https://github.com/docker-library/php/issues/822 --with-pic \ \ # --enable-ftp is included here for compatibility with existing versions. ftp_ssl_connect() needed ftp to be compiled statically before PHP 7.0 (see https://github.com/docker-library/php/issues/236). --enable-ftp \ # --enable-mbstring is included here because otherwise there's no way to get pecl to use it properly (see https://github.com/docker-library/php/issues/195) --enable-mbstring \ # --enable-mysqlnd is included here because it's harder to compile after the fact than extensions are (since it's a plugin for several extensions, not an extension in itself) --enable-mysqlnd \ # https://wiki.php.net/rfc/argon2_password_hash --with-password-argon2 \ # https://wiki.php.net/rfc/libsodium --with-sodium=shared \ # always build against system sqlite3 (https://github.com/php/php-src/commit/6083a387a81dbbd66d6316a3a12a63f06d5f7109) --with-pdo-sqlite=/usr \ --with-sqlite3=/usr \ \ --with-curl \ --with-iconv=/usr \ --with-openssl \ --with-readline \ --with-zlib \ \ # https://github.com/docker-library/php/pull/1259 --enable-phpdbg \ --enable-phpdbg-readline \ \ # in PHP 7.4+, the pecl/pear installers are officially deprecated (requiring an explicit "--with-pear") --with-pear \ \ # bundled pcre does not support JIT on riscv64 until 10.41 (php 8.3+) # https://github.com/PCRE2Project/pcre2/commits/pcre2-10.41/src/sljit/sljitNativeRISCV_64.c # https://github.com/php/php-src/tree/php-8.3.0/ext/pcre/pcre2lib $(test "$gnuArch" = 'riscv64-linux-musl' && echo '--without-pcre-jit') \ ; \ make -j "$(nproc)"; \ find -type f -name '*.a' -delete; \ make install; \ find \ /usr/local \ -type f \ -perm '/0111' \ -exec sh -euxc ' \ strip --strip-all "$@" || : \ ' -- '{}' + \ ; \ make clean; \ \ # https://github.com/docker-library/php/issues/692 (copy default example "php.ini" files somewhere easily discoverable) cp -v php.ini-* "$PHP_INI_DIR/"; \ \ cd /; \ docker-php-source delete; \ \ runDeps="$( \ scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \ | tr ',' '\n' \ | sort -u \ | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ )"; \ apk add --no-cache $runDeps; \ \ apk del --no-network .build-deps; \ \ # update pecl channel definitions https://github.com/docker-library/php/issues/443 pecl update-channels; \ rm -rf /tmp/pear ~/.pearrc; \ \ # smoke test php --version # chialab: from the source commit. ADD --chmod=755 \ $DOCKER_PHP_SCRIPTS/docker-php-ext-configure \ $DOCKER_PHP_SCRIPTS/docker-php-ext-enable \ $DOCKER_PHP_SCRIPTS/docker-php-ext-install \ $DOCKER_PHP_SCRIPTS/docker-php-entrypoint \ /usr/local/bin/ # enable OPcache by default (https://wiki.php.net/rfc/make_opcache_required) RUN docker-php-ext-enable opcache # sodium was built as a shared module (so that it can be replaced later if so desired), so let's enable it too (https://github.com/docker-library/php/issues/598) RUN docker-php-ext-enable sodium ENTRYPOINT ["docker-php-entrypoint"] CMD ["php", "-a"]