Files
laravel-starter-kit/docker/common/php-fpm/Dockerfile

98 lines
2.9 KiB
Docker

# docker/common/php-fpm/Dockerfile
# Stage 1: Build environment and Composer dependencies
FROM php:8.4-fpm AS builder
# Install system dependencies and PHP extensions required for Laravel + MySQL/PostgreSQL support
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
unzip \
libpq-dev \
libonig-dev \
libssl-dev \
libxml2-dev \
libcurl4-openssl-dev \
libicu-dev \
libzip-dev \
&& docker-php-ext-install -j"$(nproc)" \
pdo_mysql \
pdo_pgsql \
pgsql \
opcache \
intl \
zip \
bcmath \
soap \
&& pecl install redis \
&& docker-php-ext-enable redis \
&& apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Arbeitsverzeichnis
WORKDIR /var/www
# Kompletten Code kopieren (für composer-Skripte wie artisan package:discover)
COPY . /var/www
# Composer installieren und Dependencies holen
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
&& composer install --no-dev --optimize-autoloader --no-interaction --no-progress --prefer-dist
# Stage 2: Development image (einziger Runtime-Stage)
FROM builder AS development
# Xdebug / Dev-Settings
ARG XDEBUG_ENABLED=true
ARG XDEBUG_MODE=develop,coverage,debug,profile
ARG XDEBUG_HOST=host.docker.internal
ARG XDEBUG_IDE_KEY=DOCKER
ARG XDEBUG_LOG=/dev/stdout
ARG XDEBUG_LOG_LEVEL=0
# User/Group-IDs für die Rechte-Synchronisierung
ARG UID=1000
ARG GID=1000
USER root
# Xdebug konfigurieren, falls aktiviert
RUN if [ "${XDEBUG_ENABLED}" = "true" ]; then \
pecl install xdebug && \
docker-php-ext-enable xdebug && \
{ \
echo "xdebug.mode=${XDEBUG_MODE}"; \
echo "xdebug.idekey=${XDEBUG_IDE_KEY}"; \
echo "xdebug.log=${XDEBUG_LOG}"; \
echo "xdebug.log_level=${XDEBUG_LOG_LEVEL}"; \
echo "xdebug.client_host=${XDEBUG_HOST}"; \
echo "xdebug.start_with_request=yes"; \
} >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini ; \
fi
# User/Gruppe anlegen (oder existierende Gruppe wiederverwenden)
RUN if getent group "${GID}" >/dev/null; then \
group_name="$(getent group "${GID}" | cut -d: -f1)"; \
useradd -m -u "${UID}" -g "${GID}" -s /bin/bash www; \
else \
groupadd -g "${GID}" www && \
useradd -m -u "${UID}" -g www -s /bin/bash www; \
group_name=www; \
fi \
&& sed -i "s/user = www-data/user = www/g" /usr/local/etc/php-fpm.d/www.conf \
&& sed -i "s/group = www-data/group = ${group_name}/g" /usr/local/etc/php-fpm.d/www.conf
# Arbeitsverzeichnis
WORKDIR /var/www
# neuen Entry-Point für Dev-Container verwenden
COPY ./docker/php-fpm/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
# Zurück auf unprivilegierten User
USER www
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
EXPOSE 9000
CMD ["php-fpm"]