# Produktions-Image für endeavour (KeyHelp-Server, siehe docs/implement-endeavour.md). # Unabhängig von docker/prod.Dockerfile, das der bestehende Server weiter nutzt. # # Targets: # app – PHP-FPM mit Code, vendor/ und gebauten Assets # web – nginx, liefert public/ aus und reicht PHP an "app" weiter # --------------------------------------------------------------------------- # base: PHP 8.5 mit den Extensions, die mareike braucht # --------------------------------------------------------------------------- FROM php:8.5-fpm-alpine AS base ARG UID=2000 ARG GID=2000 RUN apk add --no-cache \ imagemagick \ libpng \ libxml2 \ libzip \ oniguruma \ && apk add --no-cache --virtual .build-deps \ $PHPIZE_DEPS \ imagemagick-dev \ libpng-dev \ libxml2-dev \ libzip-dev \ oniguruma-dev \ && pecl install imagick \ && docker-php-ext-enable imagick \ && docker-php-ext-install mysqli pdo_mysql mbstring zip exif pcntl gd \ && apk del .build-deps \ && rm -rf /tmp/pear # Nutzer mit der UID/GID des Host-Nutzers, damit das eingebundene storage/ beschreibbar ist. # Existiert die GID im Image schon, wird die vorhandene Gruppe verwendet. RUN if getent group "${GID}" > /dev/null; then \ GROUP_NAME="$(getent group "${GID}" | cut -d: -f1)"; \ else \ addgroup -S -g "${GID}" mareike && GROUP_NAME=mareike; \ fi \ && adduser -S -D -H -u "${UID}" -G "${GROUP_NAME}" mareike COPY --chmod=0755 docker/php/composer.phar /usr/bin/composer COPY docker/endeavour/php.ini /usr/local/etc/php/conf.d/zz-mareike.ini WORKDIR /var/www/html # --------------------------------------------------------------------------- # vendor: Composer-Abhängigkeiten (ohne Dev-Pakete) # --------------------------------------------------------------------------- FROM base AS vendor RUN apk add --no-cache git unzip COPY composer.json composer.lock ./ RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist --no-interaction --no-progress # --------------------------------------------------------------------------- # assets: Vite-Build (Vite importiert aus app/, daher der volle Quellcode) # --------------------------------------------------------------------------- FROM node:24-alpine AS assets WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci --no-audit --no-fund COPY . . RUN npm run build # --------------------------------------------------------------------------- # app: PHP-FPM # --------------------------------------------------------------------------- FROM base AS app COPY . . COPY --from=vendor /var/www/html/vendor ./vendor COPY --from=assets /app/public/build ./public/build # Der Code gehört root; beschreibbar sind nur storage/ und bootstrap/cache/. RUN composer dump-autoload --optimize --no-dev --no-interaction \ && mkdir -p \ storage/app/private \ storage/app/public \ storage/framework/cache/data \ storage/framework/sessions \ storage/framework/views \ storage/logs \ storage/temp \ && chown -R mareike: storage bootstrap/cache USER mareike EXPOSE 9000 CMD ["php-fpm"] # --------------------------------------------------------------------------- # web: nginx vor PHP-FPM # --------------------------------------------------------------------------- FROM nginx:stable-alpine AS web COPY docker/endeavour/nginx.conf /etc/nginx/conf.d/default.conf COPY --from=app /var/www/html/public /var/www/html/public EXPOSE 80