31290517ba
docker-entrypoint-initdb.d only applies db/init.sql, and only on a brand new volume - existing installs never got db/migrations/*.sql applied unless someone ran them by hand. This bit twice this session (qr-oss's own init.sql was missing a migration, and qr-vip's live DB was two migrations behind after a code deploy). scripts/migrate.php now runs automatically on every container start via a new entrypoint wrapper, applying any not-yet-recorded migration - safe to run repeatedly since every migration file already checks information_schema before altering. Also caught in the process: Dockerfile.fpm (the production image) never installed phpmailer/phpmailer, unlike the dev Dockerfile - meaning self-registration's password email has been silently fatal-erroring in production since the nginx+php-fpm switch.
77 lines
2.8 KiB
Docker
77 lines
2.8 KiB
Docker
FROM php:8.4-fpm
|
|
|
|
RUN if [ "$(grep '^VERSION_ID=' /etc/os-release | cut -d '=' -f 2 | tr -d '"')" -eq "9" ]; then \
|
|
sed -i -e 's/deb.debian.org/archive.debian.org/g' \
|
|
-e 's/security.debian.org/archive.debian.org/g' \
|
|
-e '/stretch-updates/d' /etc/apt/sources.list; \
|
|
fi
|
|
|
|
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
|
|
|
|
RUN chmod +x /usr/local/bin/install-php-extensions
|
|
|
|
RUN DEBIAN_FRONTEND=noninteractive apt-get update -q \
|
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -qq -y \
|
|
curl \
|
|
git \
|
|
libzip-dev \
|
|
libjpeg62-turbo-dev \
|
|
libpng-dev \
|
|
libfreetype6-dev \
|
|
zip unzip \
|
|
&& install-php-extensions \
|
|
gd \
|
|
gettext \
|
|
imagick \
|
|
intl \
|
|
mysqli \
|
|
opcache \
|
|
pdo_mysql \
|
|
sockets \
|
|
zip
|
|
|
|
# Install Composer.
|
|
ENV PATH=$PATH:/root/composer/vendor/bin \
|
|
COMPOSER_ALLOW_SUPERUSER=1 \
|
|
COMPOSER_HOME=/root/composer
|
|
RUN cd /opt \
|
|
&& curl -sSL https://getcomposer.org/installer > composer-setup.php \
|
|
&& curl -sSL https://composer.github.io/installer.sha384sum > composer-setup.sha384sum \
|
|
&& sha384sum --check composer-setup.sha384sum \
|
|
&& php composer-setup.php --install-dir=/usr/local/bin --filename=composer --2 \
|
|
&& rm /opt/composer-setup.php /opt/composer-setup.sha384sum
|
|
|
|
RUN mkdir -p /opt && chmod 777 /opt
|
|
WORKDIR /opt
|
|
# See Dockerfile: pinned to a specific release tag instead of an unpinned clone of master.
|
|
RUN git clone --branch 6.0.1 --depth 1 https://github.com/chillerlan/php-qrcode.git \
|
|
&& chmod -R 777 ./php-qrcode
|
|
RUN cp ./php-qrcode/composer.json /var/www/html/composer.json
|
|
RUN cp -R ./php-qrcode/src /var/www/html/
|
|
|
|
WORKDIR /var/www/html
|
|
RUN composer update
|
|
RUN composer require phpmailer/phpmailer:^6.9
|
|
COPY ./src ./
|
|
COPY ./db/migrations ./db/migrations
|
|
RUN chown -R www-data:www-data /var/www/html \
|
|
&& find /var/www/html -type f -exec chmod 644 {} \; \
|
|
&& find /var/www/html -type d -exec chmod 755 {} \;
|
|
|
|
# Qr code storage lives outside the document root so files can only be reached through
|
|
# the authenticated qrcode_image.php / qrcode_zip_download.php endpoints.
|
|
RUN mkdir -p /var/www/qrcode-storage/zip \
|
|
&& chown -R www-data:www-data /var/www/qrcode-storage \
|
|
&& chmod -R 775 /var/www/qrcode-storage
|
|
|
|
# Applies any not-yet-applied db/migrations/*.sql on every container start (see
|
|
# src/scripts/migrate.php) - docker-entrypoint-initdb.d only runs db/init.sql, and only
|
|
# on a brand new volume, so without this an existing install's schema silently falls
|
|
# behind the code on every `git pull` + restart.
|
|
COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
|
|
RUN chmod +x /usr/local/bin/entrypoint.sh
|
|
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
|
|
|
EXPOSE 9000
|
|
CMD ["php-fpm"]
|