From 66e566b99a64f04d4bcdb5581c21cfc300d209a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 5 Feb 2023 18:58:57 +0100 Subject: [PATCH] Use precompiled PHP extensions for docker container This should hopefully reduce the build times for cross compiled images, as we dont have to build extensions from source there. --- .docker/apache2-foreground | 43 +++++++++++++++++++ .docker/partdb-entrypoint.sh | 5 +++ .docker/symfony.conf | 10 +++++ Dockerfile | 82 ++++++++++++++++++++++++++++++------ 4 files changed, 127 insertions(+), 13 deletions(-) create mode 100644 .docker/apache2-foreground diff --git a/.docker/apache2-foreground b/.docker/apache2-foreground new file mode 100644 index 00000000..713c6546 --- /dev/null +++ b/.docker/apache2-foreground @@ -0,0 +1,43 @@ +#!/bin/bash + +### Taken from here: https://github.com/docker-library/php/blob/master/apache2-foreground + +set -e + +# Note: we don't just use "apache2ctl" here because it itself is just a shell-script wrapper around apache2 which provides extra functionality like "apache2ctl start" for launching apache2 in the background. +# (also, when run as "apache2ctl ", it does not use "exec", which leaves an undesirable resident shell process) + +: "${APACHE_CONFDIR:=/etc/apache2}" +: "${APACHE_ENVVARS:=$APACHE_CONFDIR/envvars}" +if test -f "$APACHE_ENVVARS"; then + . "$APACHE_ENVVARS" +fi + +# Apache gets grumpy about PID files pre-existing +: "${APACHE_RUN_DIR:=/var/run/apache2}" +: "${APACHE_PID_FILE:=$APACHE_RUN_DIR/apache2.pid}" +rm -f "$APACHE_PID_FILE" + +# create missing directories +# (especially APACHE_RUN_DIR, APACHE_LOCK_DIR, and APACHE_LOG_DIR) +for e in "${!APACHE_@}"; do + if [[ "$e" == *_DIR ]] && [[ "${!e}" == /* ]]; then + # handle "/var/lock" being a symlink to "/run/lock", but "/run/lock" not existing beforehand, so "/var/lock/something" fails to mkdir + # mkdir: cannot create directory '/var/lock': File exists + dir="${!e}" + while [ "$dir" != "$(dirname "$dir")" ]; do + dir="$(dirname "$dir")" + if [ -d "$dir" ]; then + break + fi + absDir="$(readlink -f "$dir" 2>/dev/null || :)" + if [ -n "$absDir" ]; then + mkdir -p "$absDir" + fi + done + + mkdir -p "${!e}" + fi +done + +exec apache2 -DFOREGROUND "$@" \ No newline at end of file diff --git a/.docker/partdb-entrypoint.sh b/.docker/partdb-entrypoint.sh index 69fc3a4e..e73bc83b 100644 --- a/.docker/partdb-entrypoint.sh +++ b/.docker/partdb-entrypoint.sh @@ -39,5 +39,10 @@ if [ -d /var/www/html/var/db ]; then fi fi +# first arg is `-f` or `--some-option` (taken from https://github.com/docker-library/php/blob/master/8.2/bullseye/apache/docker-php-entrypoint) +if [ "${1#-}" != "$1" ]; then + set -- apache2-foreground "$@" +fi + # Pass to the original entrypoint exec "$@" \ No newline at end of file diff --git a/.docker/symfony.conf b/.docker/symfony.conf index 45395c84..01aa91f0 100644 --- a/.docker/symfony.conf +++ b/.docker/symfony.conf @@ -24,6 +24,16 @@ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined + # Pass the configuration from the docker env to the PHP environment (here you should list all .env options) + PassEnv APP_ENV APP_DEBUG APP_SECRET + PassEnv DATABASE_URL + PassEnv DEFAULT_LANG DEFAULT_TIMEZONE BASE_CURRENCY INSTANCE_NAME ALLOW_ATTACHMENT_DOWNLOADS USE_GRAVATAR + PassEnv MAILER_DSN ALLOW_EMAIL_PW_RESET EMAIL_SENDER_EMAIL EMAIL_SENDER_NAME + PassEnv HISTORY_SAVE_CHANGED_FIELDS HISTORY_SAVE_CHANGED_DATA HISTORY_SAVE_REMOVED_DATA + PassEnv ERROR_PAGE_ADMIN_EMAIL ERROR_PAGE_SHOW_HELP + PassEnv DEMO_MODE NO_URL_REWRITE_AVAILABLE FIXER_API_KEY BANNER + + # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the diff --git a/Dockerfile b/Dockerfile index 53ad011c..eae48140 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,19 +1,62 @@ -FROM php:8.1-apache +FROM debian:bullseye-slim # Install needed dependencies for PHP build -RUN apt-get update && apt-get install -y pkg-config curl libcurl4-openssl-dev libicu-dev \ - libpng-dev libjpeg-dev libfreetype6-dev gnupg zip libzip-dev libjpeg62-turbo-dev libonig-dev libxslt-dev libwebp-dev vim \ - && apt-get -y autoremove && apt-get clean autoclean && rm -rf /var/lib/apt/lists/* +#RUN apt-get update && apt-get install -y pkg-config curl libcurl4-openssl-dev libicu-dev \ +# libpng-dev libjpeg-dev libfreetype6-dev gnupg zip libzip-dev libjpeg62-turbo-dev libonig-dev libxslt-dev libwebp-dev vim \ +# && apt-get -y autoremove && apt-get clean autoclean && rm -rf /var/lib/apt/lists/* -# Install GD with support for multiple formats -RUN docker-php-ext-configure gd \ - --with-webp \ - --with-jpeg \ - --with-freetype \ - && docker-php-ext-install -j "$(nproc)" gd pdo_mysql intl bcmath zip xsl +RUN apt-get update && apt-get -y install apt-transport-https lsb-release ca-certificates curl zip \ + && curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg \ + && sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' \ + && apt-get update && apt-get upgrade -y \ + && apt-get install -y apache2 php8.1 libapache2-mod-php8.1 php8.1-opcache php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-bcmath php8.1-intl php8.1-zip php8.1-xsl php8.1-sqlite3 php8.1-mysql gpg \ + && apt-get -y autoremove && apt-get clean autoclean && rm -rf /var/lib/apt/lists/*; + +ENV APACHE_CONFDIR /etc/apache2 +ENV APACHE_ENVVARS $APACHE_CONFDIR/envvars + +# Create workdir and set permissions if directory does not exists +RUN mkdir -p /var/www/html && chown -R www-data:www-data /var/www/html + +# Configure apache 2 (taken from https://github.com/docker-library/php/blob/master/8.2/bullseye/apache/Dockerfile) +# generically convert lines like +# export APACHE_RUN_USER=www-data +# into +# : ${APACHE_RUN_USER:=www-data} +# export APACHE_RUN_USER +# so that they can be overridden at runtime ("-e APACHE_RUN_USER=...") +RUN sed -ri 's/^export ([^=]+)=(.*)$/: ${\1:=\2}\nexport \1/' "$APACHE_ENVVARS"; \ + set -eux; . "$APACHE_ENVVARS"; \ + # delete the "index.html" that installing Apache drops in here + rm -rvf /var/www/html/*; \ + \ + # logs should go to stdout / stderr + ln -sfT /dev/stderr "$APACHE_LOG_DIR/error.log"; \ + ln -sfT /dev/stdout "$APACHE_LOG_DIR/access.log"; \ + ln -sfT /dev/stdout "$APACHE_LOG_DIR/other_vhosts_access.log"; \ + chown -R --no-dereference "$APACHE_RUN_USER:$APACHE_RUN_GROUP" "$APACHE_LOG_DIR"; + +# Enable mpm_prefork +RUN a2dismod mpm_event && a2enmod mpm_prefork + +# PHP files should be handled by PHP, and should be preferred over any other file type +RUN { \ + echo ''; \ + echo '\tSetHandler application/x-httpd-php'; \ + echo ''; \ + echo; \ + echo 'DirectoryIndex disabled'; \ + echo 'DirectoryIndex index.php index.html'; \ + echo; \ + echo ''; \ + echo '\tOptions -Indexes'; \ + echo '\tAllowOverride All'; \ + echo ''; \ + } | tee "$APACHE_CONFDIR/conf-available/docker-php.conf" \ + && a2enconf docker-php # Enable opcache and configure it recommended for symfony (see https://symfony.com/doc/current/performance.html) -RUN docker-php-ext-enable opcache; \ +RUN \ { \ echo 'opcache.memory_consumption=256'; \ echo 'opcache.max_accelerated_files=20000'; \ @@ -21,7 +64,14 @@ RUN docker-php-ext-enable opcache; \ # Configure Realpath cache for performance echo 'realpath_cache_size=4096K'; \ echo 'realpath_cache_ttl=600'; \ - } > /usr/local/etc/php/conf.d/symfony-recommended.ini + } > /etc/php/8.1/apache2/conf.d/symfony-recommended.ini + +# Increase upload limit +RUN \ + { \ + echo 'upload_max_filesize=256M'; \ + echo 'post_max_size=300M'; \ + } > /etc/php/8.1/apache2/conf.d/partdb.ini # Install node and yarn RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - @@ -31,6 +81,7 @@ RUN curl -sL https://deb.nodesource.com/setup_18.x | bash - && apt-get update && # Install composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + # Set working dir WORKDIR /var/www/html COPY --chown=www-data:www-data . . @@ -54,8 +105,13 @@ USER root # Copy entrypoint to /usr/local/bin and make it executable RUN cp ./.docker/partdb-entrypoint.sh /usr/local/bin/partdb-entrypoint.sh && chmod +x /usr/local/bin/partdb-entrypoint.sh -ENTRYPOINT ["partdb-entrypoint.sh", "docker-php-entrypoint"] +# Copy apache2-foreground to /usr/local/bin and make it executable +RUN cp ./.docker/apache2-foreground /usr/local/bin/apache2-foreground && chmod +x /usr/local/bin/apache2-foreground +ENTRYPOINT ["partdb-entrypoint.sh"] CMD ["apache2-foreground"] +# https://httpd.apache.org/docs/2.4/stopping.html#gracefulstop +STOPSIGNAL SIGWINCH + EXPOSE 80 VOLUME ["/var/www/html/uploads", "/var/www/html/public/media"] \ No newline at end of file