Tests / test (pull_request) Successful in 1m4s
The removed runtime/frankenphp-symfony package force-restarted the
worker after FRANKENPHP_LOOP_MAX requests (default 500) - memory-leak
paranoia the built-in 8.1 runner intentionally doesn't reimplement.
Restore the behavior natively so the upgrade is a no-op operationally:
- Caddyfile: global frankenphp block with max_requests {$MAX_REQUESTS}
- per-thread graceful restarts, other threads keep serving
- Dockerfile: ARG/ENV MAX_REQUESTS=500 bakes the same default the old
package had, overridable at docker build or runtime (-e, 0 disables)
- Stock FRANKENPHP_CONFIG env var remains the full-config escape hatch
- Documented in readme env table, docs/example.env, CHANGELOG, and the
upgrade plan (phase-4 staging note now checks thread recycling)
82 lines
2.4 KiB
Docker
82 lines
2.4 KiB
Docker
# use build image, to simplify final image
|
|
FROM php:8.5-trixie AS build
|
|
|
|
# install APCu and composer
|
|
RUN pecl install apcu && \
|
|
docker-php-ext-enable apcu
|
|
COPY --from=composer /usr/bin/composer /usr/bin/composer
|
|
RUN apt-get update && \
|
|
apt-get install -y unzip git
|
|
|
|
# symfony required environment variables
|
|
ENV APP_DEBUG=0
|
|
ENV APP_ENV=prod
|
|
ENV APP_SHARE_DIR=/data/preauth
|
|
|
|
# load application into build image
|
|
RUN mkdir -p /data/preauth
|
|
RUN mkdir -p /app/bin
|
|
WORKDIR /app
|
|
COPY ./bin/console /app/bin/console
|
|
COPY ./config /app/config
|
|
COPY ./public /app/public
|
|
COPY ./src /app/src
|
|
COPY ./templates /app/templates
|
|
COPY ./composer.json /app/composer.json
|
|
COPY ./composer.lock /app/composer.lock
|
|
COPY ./symfony.lock /app/symfony.lock
|
|
|
|
# install application dependencies
|
|
RUN composer install --no-dev --optimize-autoloader
|
|
RUN composer dump-env prod --empty
|
|
|
|
# start creating final image
|
|
FROM dunglas/frankenphp:php8.5-trixie
|
|
|
|
# install APCu and curl (needed for healthcheck)
|
|
RUN pecl install apcu && \
|
|
docker-php-ext-enable apcu
|
|
RUN apt-get update && \
|
|
apt-get install -y --no-install-recommends curl && \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
# symfony required environment variables
|
|
ENV APP_DEBUG=0
|
|
ENV APP_ENV=prod
|
|
ENV APP_SHARE_DIR=/data/preauth
|
|
|
|
# worker thread lifecycle: restart each PHP thread after N requests to
|
|
# contain slow memory growth. Matches the previous default loop count of
|
|
# runtime/frankenphp-symfony (removed in the Symfony 8.1 upgrade).
|
|
# Expose as a build arg so images can bake in a different default;
|
|
# MAX_REQUESTS=0 disables restarts. Runtime override: the same env var is
|
|
# read by the Caddyfile placeholder.
|
|
ARG MAX_REQUESTS=500
|
|
ENV MAX_REQUESTS=$MAX_REQUESTS
|
|
|
|
# load application into final image
|
|
WORKDIR /app
|
|
COPY --from=build /data/preauth /data/preauth
|
|
COPY --from=build /app /app
|
|
|
|
# configure container
|
|
COPY ./Caddyfile /etc/frankenphp/Caddyfile
|
|
RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini
|
|
RUN echo 'expose_php = off' > $PHP_INI_DIR/conf.d/restrict.ini
|
|
# console needs apc to manage cache
|
|
RUN echo 'apc.enable_cli = on' > $PHP_INI_DIR/conf.d/console.ini
|
|
|
|
# app uses var folder for cache storage
|
|
VOLUME ["/config", "/data"]
|
|
|
|
# runs http on standard port
|
|
EXPOSE 80
|
|
|
|
# healthcheck
|
|
HEALTHCHECK --interval=5m \
|
|
--retries=3 \
|
|
--start-interval=1s \
|
|
--start-period=10s \
|
|
--timeout=2s \
|
|
CMD curl http://localhost || exit 1
|