Писал ли Dockerfile?

«Писал ли Dockerfile?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, регулярно пишу и оптимизирую 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 при установке зависимостей.