diff --git a/Dockerfile b/Dockerfile index 6a72720..2c877b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,51 +1,148 @@ ######################################################################################################################################## # Documentation: https://git.nickyeoman.com/4lt/phpcontainer/wiki -######################################################################################################################################## +# v2.0 +################################################################################################################################# + +# Use the PHP base image FROM php:8.2.9-apache + +# Set maintainer information +LABEL version="2" LABEL maintainer="4 Lights Consulting " LABEL description="Production-ready PHP Apache container" -LABEL version="1" LABEL org.label-schema.vcs-url="https://git.nickyeoman.com/4lt/phpcontainer" -# Setup +# Set working directory and Apache document root WORKDIR /website ENV APACHE_DOCUMENT_ROOT /website/public/ -# APT -RUN apt-get update +# Install required packages +RUN set -eux; \ + apt-get update && \ + apt-get install -y --no-install-recommends ghostscript; # IMAP RUN apt-get install -y libc-client-dev libkrb5-dev libssl-dev; RUN docker-php-ext-configure imap --with-kerberos --with-imap-ssl RUN docker-php-ext-install imap -# Symfony -RUN apt-get install -y libicu-dev -RUN docker-php-ext-configure intl -RUN docker-php-ext-install intl +# Install PHP extensions +RUN set -ex; \ + \ + savedAptMark="$(apt-mark showmanual)"; \ + \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + libbz2-dev \ + libgmp-dev \ + libicu-dev \ + libfreetype6-dev \ + libjpeg-dev \ + libldap2-dev \ + libmemcached-dev \ + libmagickwand-dev \ + libpq-dev \ + libpng-dev \ + libwebp-dev \ + libzip-dev \ + ; \ + \ + docker-php-ext-configure gd \ + --with-freetype \ + --with-jpeg \ + --with-webp \ + ; \ + debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \ + docker-php-ext-configure ldap --with-libdir="lib/$debMultiarch"; \ + docker-php-ext-configure intl; \ + docker-php-ext-install -j "$(nproc)" \ + bz2 \ + bcmath \ + exif \ + gd \ + gmp \ + intl \ + ldap \ + mysqli \ + pdo_mysql \ + pdo_pgsql \ + pgsql \ + zip \ + ; \ + pecl install imagick-3.6.0 && \ + docker-php-ext-enable imagick && \ + rm -r /tmp/pear; \ + \ + out="$(php -r 'exit(0);')"; \ + [ -z "$out" ]; \ + err="$(php -r 'exit(0);' 3>&1 1>&2 2>&3)"; \ + [ -z "$err" ]; \ + \ + extDir="$(php -r 'echo ini_get("extension_dir");')"; \ + [ -d "$extDir" ]; \ + \ + pecl install APCu-5.1.21 && \ + pecl install memcached-3.2.0 && \ + pecl install redis-5.3.7 && \ + \ + docker-php-ext-enable \ + apcu \ + memcached \ + redis && \ + rm -r /tmp/pear; \ + \ + apt-mark auto '.*' > /dev/null && \ + apt-mark manual $savedAptMark && \ + ldd "$extDir"/*.so | awk '/=>/ { print $3 }' | sort -u | xargs -r dpkg-query -S | cut -d: -f1 | sort -u | xargs -rt apt-mark manual; \ + \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false && \ + rm -rf /var/lib/apt/lists/* && \ + ! { ldd "$extDir"/*.so | grep 'not found'; } && \ + err="$(php --version 3>&1 1>&2 2>&3)"; \ + [ -z "$err" ] -# GD and ZIP Extensions -RUN apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev libzip-dev -RUN docker-php-ext-configure gd --with-freetype --with-jpeg -RUN docker-php-ext-install gd -RUN docker-php-ext-install zip +# Set recommended PHP.ini settings +RUN set -eux; \ + docker-php-ext-enable opcache; \ + { \ + echo 'opcache.memory_consumption=128'; \ + echo 'opcache.interned_strings_buffer=8'; \ + echo 'opcache.max_accelerated_files=4000'; \ + echo 'opcache.revalidate_freq=2'; \ + echo 'opcache.fast_shutdown=1'; \ + } > /usr/local/etc/php/conf.d/opcache-recommended.ini -# Cleanup -RUN rm -r /var/lib/apt/lists/* +# Set recommended error logging +RUN { \ + echo 'error_reporting = E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_RECOVERABLE_ERROR'; \ + echo 'display_errors = Off'; \ + echo 'display_startup_errors = Off'; \ + echo 'log_errors = On'; \ + echo 'error_log = /dev/stderr'; \ + echo 'log_errors_max_len = 1024'; \ + echo 'ignore_repeated_errors = On'; \ + echo 'ignore_repeated_source = Off'; \ + echo 'html_errors = Off'; \ + } > /usr/local/etc/php/conf.d/error-logging.ini -# Apache settings +# Enable Apache modules and configure RemoteIP +RUN set -eux; \ + a2enmod expires headers rewrite remoteip socache_shmcb ssl && \ + { \ + echo 'RemoteIPHeader X-Forwarded-For'; \ + echo 'RemoteIPTrustedProxy 10.0.0.0/8'; \ + echo 'RemoteIPTrustedProxy 172.16.0.0/12'; \ + echo 'RemoteIPTrustedProxy 192.168.0.0/16'; \ + echo 'RemoteIPTrustedProxy 169.254.0.0/16'; \ + echo 'RemoteIPTrustedProxy 127.0.0.0/8'; \ + } > /etc/apache2/conf-available/remoteip.conf; \ + a2enconf remoteip; \ + find /etc/apache2 -type f -name '*.conf' -exec sed -ri 's/([[:space:]]*LogFormat[[:space:]]+"[^"]*)%h([^"]*")/\1%a\2/g' '{}' + +# More Apache settings RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf - RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf -RUN a2enmod expires headers rewrite socache_shmcb ssl - -RUN docker-php-ext-install mysqli pdo pdo_mysql -RUN docker-php-ext-install opcache - -# Docker config - EXPOSE 80 CMD ["apache2-foreground"]