Ответ
Да, регулярно пишу и оптимизирую Dockerfile для сборки образов PHP-приложений. Основная цель — создать воспроизводимое, легковесное и безопасное окружение.
Пример Dockerfile для Laravel-приложения с многоступенчатой сборкой:
# Этап сборки (Builder)
FROM composer:2 AS builder
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts --optimize-autoloader
COPY . .
RUN composer dump-autoload --optimize
# Финальный этап (Production)
FROM php:8.2-fpm-alpine
# Установка системных зависимостей и PHP-расширений
RUN apk add --no-cache
libzip-dev
postgresql-dev
&& docker-php-ext-install zip pdo_pgsql opcache
# Копирование скомпилированных зависимостей из этапа builder
COPY --from=builder /app /var/www/html
WORKDIR /var/www/html
# Настройка прав доступа и пользователя
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache
USER www-data
# Запуск PHP-FPM
CMD ["php-fpm"]
Ключевые практики, которые я применяю:
- Многоступенчатая сборка: Отдельный этап для установки зависимостей через Composer, чтобы в финальный образ попали только необходимые файлы, что уменьшает его размер.
- Использование легковесных базовых образов: Например,
-alpineверсий. - Объединение команд RUN: Для уменьшения количества слоев в образе.
- Правильная настройка прав пользователя: Запуск процессов от непривилегированного пользователя (не root) для безопасности.
- Кэширование слоев: Правильное копирование
composer.jsonиcomposer.lockдо копирования всего кода, чтобы использовать кэш Docker при установке зависимостей.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶