# syntax=docker/dockerfile:1.4 ARG PHP_EXTENSIONS="exif pcntl bcmath gd ctype curl dom fileinfo filter hash mbstring openssl pcre session tokenizer xml sockets pdo pdo_mysql pdo_pgsql redis" FROM dunglas/frankenphp:1.9-php8.4-alpine AS frankenphp ARG PHP_EXTENSIONS ARG APP_USER=laravel ARG APP_UID=1000 ARG APP_GID=1000 COPY .docker/php/wait-for-it.sh /usr/local/bin/wait-for-it COPY .docker/octane/utilities.sh /tmp/utilities.sh RUN apk add --no-cache bash unzip git curl wget nodejs npm && \ install-php-extensions ${PHP_EXTENSIONS} && \ rm -rf /var/cache/apk/* /usr/src/* /usr/local/lib/php/doc/* && \ chmod 555 /usr/local/bin/wait-for-it # Group & User RUN addgroup -g $APP_GID $APP_USER || true && \ adduser --disabled-password --uid $APP_UID --ingroup $APP_USER $APP_USER || true && \ mkdir -p /app /home/$APP_USER && chown -R $APP_USER /app /home/$APP_USER && \ cat /tmp/utilities.sh >> /home/${APP_USER}/.bashrc && \ rm -rf /tmp/* # Composer COPY --chown=${APP_USER} --from=composer:latest /usr/bin/composer /usr/bin/composer COPY --chown=${APP_USER} .docker/php/composer /home/laravel/.composer WORKDIR /app ARG GITHUB_PROJECT_NAME LABEL org.opencontainers.image.source=https://github.com/${GITHUB_PROJECT_NAME} FROM frankenphp AS cli COPY .docker/php/config/production.ini /usr/local/etc/php/conf.d/ # Supercronic RUN apkArch="$(apk --print-arch)" \ && case "$apkArch" in \ armhf) _cronic_fname='supercronic-linux-arm' ;; \ aarch64) _cronic_fname='supercronic-linux-arm64' ;; \ arm64) _cronic_fname='supercronic-linux-arm64' ;; \ x86_64) _cronic_fname='supercronic-linux-amd64' ;; \ amd64) _cronic_fname='supercronic-linux-amd64' ;; \ x86) _cronic_fname='supercronic-linux-386' ;; \ *) echo >&2 "error: unsupported architecture: $apkArch"; exit 1 ;; \ esac \ && curl -L -o /usr/bin/supercronic "https://github.com/aptible/supercronic/releases/download/v0.2.29/${_cronic_fname}" \ && chmod +x /usr/bin/supercronic \ && mkdir /etc/supercronic \ && echo '*/1 * * * * php /app/artisan schedule:run' > /etc/supercronic/laravel # Composer COPY --chown=${APP_USER} ./composer.* . RUN composer config --no-plugins allow-plugins.spiral/composer-publish-plugin false \ && composer install --no-cache --no-ansi --no-autoloader --no-scripts --no-dev --prefer-dist # Npm COPY --chown=${APP_USER} ./package* . RUN mkdir -p /app/public/build && npm install # Other USER ${APP_USER} COPY --chown=${APP_UID} ./ . RUN set -x \ && composer dump-autoload -n --optimize \ && php artisan storage:link \ && php artisan package:discover FROM cli AS php HEALTHCHECK --start-period=5s --interval=2s --timeout=5s --retries=8 CMD php artisan octane:status || exit 1 FROM frankenphp AS development COPY .docker/php/config/development.ini /usr/local/etc/php/conf.d/development.ini RUN apk add --no-cache --virtual .build-deps autoconf build-base linux-headers && \ pecl install xdebug && \ docker-php-ext-enable xdebug && \ pecl clear-cache && apk del .build-deps USER $APP_USER FROM dunglas/frankenphp:1.9-php8.4-trixie AS devcontainer ARG PHP_EXTENSIONS RUN echo "deb http://mirror.docker.ru/debian trixie main contrib non-free non-free-firmware" > /etc/apt/sources.list \ && echo "deb http://mirror.docker.ru/debian trixie-updates main contrib non-free non-free-firmware" >> /etc/apt/sources.list \ && echo "deb http://mirror.docker.ru/debian-security trixie-security main contrib non-free non-free-firmware" >> /etc/apt/sources.list \ && apt-get update && apt-get -y upgrade && \ apt install -y --no-install-recommends $PHPIZE_DEPS sudo ca-certificates build-essential unzip curl wget zip bash && \ install-php-extensions ${PHP_EXTENSIONS} && \ apt-get clean && rm -rf /var/lib/apt/lists/*