diff --git a/docs/best-practices/deployment.md b/docs/best-practices/deployment.md index dffa44d..9543a17 100644 --- a/docs/best-practices/deployment.md +++ b/docs/best-practices/deployment.md @@ -690,7 +690,6 @@ be achieved by using a `Dockerfile` with the following contents: === "Dockerfile basics for development" ```docker title="Dockerfile" - # syntax=docker/dockerfile:1 FROM php:8.5-cli WORKDIR /app/ @@ -706,27 +705,38 @@ be achieved by using a `Dockerfile` with the following contents: === "Dockerfile for minimal production image" ```docker title="Dockerfile" - # syntax=docker/dockerfile:1 - FROM composer:2 AS build + # base PHP version for the build and final project + FROM php:8.5-alpine AS php-version - WORKDIR /app/ + # base composer stage to install dependencies in parallel + FROM composer:2 AS vendor COPY composer.json composer.lock ./ RUN composer install --no-dev --ignore-platform-reqs --optimize-autoloader - FROM php:8.5-alpine + # base build stage with build tools to compile extensions in parallel + FROM php-version AS phpize + RUN apk --no-cache add --virtual .phpize-deps autoconf gcc libc-dev linux-headers make + + FROM phpize AS ext-ev + RUN MAKEFLAGS="-j$(nproc)" pecl install ev && docker-php-ext-enable ev + + FROM phpize AS ext-sockets + RUN docker-php-ext-install -j$(nproc) sockets - # recommended: install optional extensions ext-ev and ext-sockets - RUN apk --no-cache add ${PHPIZE_DEPS} libev linux-headers \ - && pecl install ev \ - && docker-php-ext-enable ev \ - && docker-php-ext-install sockets \ - && apk del ${PHPIZE_DEPS} linux-headers \ - && echo "memory_limit = -1" >> "$PHP_INI_DIR/conf.d/acme.ini" + # base os stage with recommended extensions ext-ev and ext-sockets + FROM php-version AS os + COPY --from=ext-ev /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/ + COPY --from=ext-ev /usr/local/etc/php/conf.d/docker-php-ext-ev.ini /usr/local/etc/php/conf.d/ + COPY --from=ext-sockets /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/ + COPY --from=ext-sockets /usr/local/etc/php/conf.d/docker-php-ext-sockets.ini /usr/local/etc/php/conf.d/ + RUN echo "memory_limit = -1" >> "$PHP_INI_DIR/conf.d/acme.ini" + # final project stage + FROM os WORKDIR /app/ COPY public/ public/ # COPY src/ src/ - COPY --from=build /app/vendor/ vendor/ + COPY --from=vendor /app/vendor/ vendor/ ENV X_LISTEN=0.0.0.0:8080 EXPOSE 8080 diff --git a/tests/integration/Dockerfile-basics b/tests/integration/Dockerfile-basics index 670d87b..4bbac99 100644 --- a/tests/integration/Dockerfile-basics +++ b/tests/integration/Dockerfile-basics @@ -1,4 +1,3 @@ -# syntax=docker/dockerfile:1 FROM php:8.5-cli WORKDIR /app/ diff --git a/tests/integration/Dockerfile-production b/tests/integration/Dockerfile-production index 607ff38..0b18757 100644 --- a/tests/integration/Dockerfile-production +++ b/tests/integration/Dockerfile-production @@ -1,27 +1,38 @@ -# syntax=docker/dockerfile:1 -FROM composer:2 AS build +# base PHP version for the build and final project +FROM php:8.5-alpine AS php-version -WORKDIR /app/ +# base composer stage to install dependencies in parallel +FROM composer:2 AS vendor COPY composer.json composer.lock ./ # production environment should install optimized dependencies: # RUN composer install --no-dev --ignore-platform-reqs --optimize-autoloader # dev environment already has dependencies installed: COPY vendor/ vendor/ -FROM php:8.5-alpine +# base build stage with build tools to compile extensions in parallel +FROM php-version AS phpize +RUN apk --no-cache add --virtual .phpize-deps autoconf gcc libc-dev linux-headers make + +FROM phpize AS ext-ev +RUN MAKEFLAGS="-j$(nproc)" pecl install ev && docker-php-ext-enable ev + +FROM phpize AS ext-sockets +RUN docker-php-ext-install -j$(nproc) sockets -# recommended: install optional extensions ext-ev and ext-sockets -RUN apk --no-cache add ${PHPIZE_DEPS} libev linux-headers \ - && pecl install ev \ - && docker-php-ext-enable ev \ - && docker-php-ext-install sockets \ - && apk del ${PHPIZE_DEPS} linux-headers \ - && echo "memory_limit = -1" >> "$PHP_INI_DIR/conf.d/acme.ini" +# base os stage with recommended extensions ext-ev and ext-sockets +FROM php-version AS os +COPY --from=ext-ev /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/ +COPY --from=ext-ev /usr/local/etc/php/conf.d/docker-php-ext-ev.ini /usr/local/etc/php/conf.d/ +COPY --from=ext-sockets /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/ +COPY --from=ext-sockets /usr/local/etc/php/conf.d/docker-php-ext-sockets.ini /usr/local/etc/php/conf.d/ +RUN echo "memory_limit = -1" >> "$PHP_INI_DIR/conf.d/acme.ini" +# final project stage +FROM os WORKDIR /app/ COPY public/ public/ # COPY src/ src/ -COPY --from=build /app/vendor/ vendor/ +COPY --from=vendor /app/vendor/ vendor/ ENV X_LISTEN=0.0.0.0:8080 EXPOSE 8080