2026-04-01 10:55:26 -07:00
|
|
|
FROM almalinux/10-base
|
2026-04-01 10:08:00 -07:00
|
|
|
ARG PHPVER=83
|
2026-10-21 06:07:48 -07:00
|
|
|
# Per-CI-run value: the first RUN below (dnf update) and everything after it can
|
|
|
|
|
# never be a layer-cache hit, so every build gets the repos' current packages.
|
|
|
|
|
# Local builds: --build-arg CACHE_BUST=$(date +%s) or --no-cache.
|
|
|
|
|
ARG CACHE_BUST=
|
2026-10-21 08:29:31 -07:00
|
|
|
# php.net's current release for this branch (CI); the build fails on older PHP.
|
|
|
|
|
ARG EXPECT_PHP_MIN=
|
2026-04-01 10:08:00 -07:00
|
|
|
|
|
|
|
|
# Install repos, update, install only needed packages (no httpd/mod_ssl), clean up in one layer
|
|
|
|
|
RUN dnf install -y \
|
2026-04-01 10:55:26 -07:00
|
|
|
https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm \
|
|
|
|
|
https://rpms.remirepo.net/enterprise/remi-release-10.rpm && \
|
2026-10-21 08:02:38 -07:00
|
|
|
# Use Remi's origin, not the mirrorlist: during the 2026-10-21 PHP security
|
|
|
|
|
# release the mirrors lagged hours behind (still 8.2.34 when 8.2.35 was out),
|
2026-10-21 08:29:31 -07:00
|
|
|
# so builds shipped unpatched PHP. HTTPS first; plain http only as a fallback
|
|
|
|
|
# because the origin's HTTPS dropped/timed out under that day's load. A
|
|
|
|
|
# replayed (old) http index can't ship old PHP: packages stay GPG-checked and
|
|
|
|
|
# the EXPECT_PHP_MIN gate below fails the build on anything older than php.net.
|
|
|
|
|
sed -i -e 's|^#baseurl=http://\(.*\)$|baseurl=https://\1 http://\1|' -e 's/^mirrorlist=/#mirrorlist=/' /etc/yum.repos.d/remi*.repo && \
|
|
|
|
|
printf 'retries=10\ntimeout=60\n' >> /etc/dnf/dnf.conf && \
|
2026-04-01 10:08:00 -07:00
|
|
|
dnf update -y && \
|
2026-04-01 11:11:10 -07:00
|
|
|
dnf install -y openssl wget procps cronie iproute postgresql-devel microdnf less git \
|
2026-04-01 10:08:00 -07:00
|
|
|
nano rsync unzip zip mariadb bind-utils jq patch nc tree dos2unix fcgi && \
|
|
|
|
|
dnf clean all && \
|
|
|
|
|
rm -rf /var/cache/dnf /usr/share/doc /usr/share/man /usr/share/locale/*
|
|
|
|
|
|
|
|
|
|
# Copy scripts into the image and set permissions
|
|
|
|
|
COPY ./scripts/ /scripts/
|
|
|
|
|
RUN chmod +x /scripts/*
|
|
|
|
|
|
2026-04-01 15:48:58 -07:00
|
|
|
# Install ImageMagick from EPEL with HEIC/HEIF/AVIF support
|
|
|
|
|
RUN dnf install -y ImageMagick ImageMagick-libs ImageMagick-heic && \
|
2026-04-01 10:15:15 -07:00
|
|
|
dnf clean all
|
|
|
|
|
|
2026-04-01 10:08:00 -07:00
|
|
|
# Create needed dirs, install PHP, clean up (no SSL cert, no httpd)
|
|
|
|
|
RUN mkdir -p /run/php-fpm/ && \
|
|
|
|
|
/scripts/install-php$PHPVER.sh && \
|
2026-10-21 08:29:31 -07:00
|
|
|
# CI passes php.net's current release for the branch; never ship older PHP.
|
|
|
|
|
if [ -n "$EXPECT_PHP_MIN" ]; then \
|
|
|
|
|
php -r 'exit(version_compare(PHP_VERSION, getenv("EXPECT_PHP_MIN"), ">=") ? 0 : 1);' || \
|
|
|
|
|
{ echo "FATAL: built PHP $(php -r 'echo PHP_VERSION;') is older than php.net $EXPECT_PHP_MIN"; exit 1; }; \
|
|
|
|
|
else echo "WARNING: no EXPECT_PHP_MIN (local build) - PHP version not gated"; fi && \
|
2026-10-21 06:07:48 -07:00
|
|
|
echo "PHP version report:" && php -v && rpm -q php-cli php-common php-fpm && \
|
2026-04-01 10:08:00 -07:00
|
|
|
rm -rf /tmp/*
|
|
|
|
|
|
|
|
|
|
# Download and install wp-cli
|
|
|
|
|
RUN curl -L -o /usr/local/bin/wp https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \
|
|
|
|
|
chmod +x /usr/local/bin/wp
|
|
|
|
|
|
|
|
|
|
# Download and install Composer
|
|
|
|
|
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
|
|
|
|
|
chmod +x /usr/local/bin/composer
|
|
|
|
|
|
|
|
|
|
# Copy configs (PHP only, no Apache configs)
|
|
|
|
|
COPY ./configs/prod-php.ini /etc/php.ini
|
2026-10-21 07:21:47 -07:00
|
|
|
# php2shell mitigation (CVE-2026-109618/-109619). Named zz- so it sorts after
|
|
|
|
|
# every other scan-dir ini (incl. runtime-written 99-*) and wins. Remove once
|
|
|
|
|
# all images ship PHP >= 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12.
|
|
|
|
|
COPY ./configs/zz-php2shell-mitigation.ini /etc/php.d/zz-php2shell-mitigation.ini
|
2026-04-01 10:08:00 -07:00
|
|
|
COPY ./configs/mariadb.repo /etc/yum.repos.d/
|
|
|
|
|
|
|
|
|
|
# Set up cron job for log rotation
|
|
|
|
|
RUN echo "15 */12 * * * root /scripts/log-rotate.sh" >> /etc/crontab
|
|
|
|
|
|
|
|
|
|
EXPOSE 9000
|
|
|
|
|
|
|
|
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \
|
|
|
|
|
CMD SCRIPT_FILENAME=/fpm-ping SCRIPT_NAME=/fpm-ping REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000 | grep -q pong || exit 1
|
|
|
|
|
|
|
|
|
|
ENTRYPOINT [ "/scripts/entrypoint-fpm.sh" ]
|