Какой сложности Dockerfile вам приходилось писать и поддерживать?

«Какой сложности Dockerfile вам приходилось писать и поддерживать?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сложность Dockerfile варьировалась от простых однострочников до многоэтапных сборок с оптимизациями для безопасности и производительности.

Пример простого Dockerfile (статический сайт):

FROM nginx:alpine
COPY ./public /usr/share/nginx/html
EXPOSE 80

Пример сложного, многоэтапного Dockerfile для Python-приложения:

# Этап 1: Сборка зависимостей
FROM python:3.11-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

# Этап 2: Сборка фронтенда (если есть)
FROM node:18-alpine as frontend-builder
WORKDIR /frontend
COPY frontend/package*.json .
RUN npm ci --only=production
COPY frontend/ .
RUN npm run build

# Этап 3: Финальный образ
FROM python:3.11-slim
WORKDIR /app

# Копируем зависимости из builder-этапа
COPY --from=builder /root/.local /root/.local
# Копируем собранный фронтенд
COPY --from=frontend-builder /frontend/dist /app/static

# Создаем непривилегированного пользователя
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
USER appuser

# Копируем код приложения
COPY --chown=appuser:appgroup . .

# Обновляем PATH для пользовательских скриптов
ENV PATH=/root/.local/bin:$PATH

# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 
  CMD python healthcheck.py

CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:wsgi_app"]

Ключевые аспекты сложности, которые я учитываю:

  • Многоэтапность: Для минимизации итогового образа.
  • Безопасность: Обязательное использование непривилегированного пользователя (USER), регулярное обновление базовых образов.
  • Кэширование слоев: Правильный порядок инструкций (COPY requirements.txt до COPY . .) для ускорения сборок.
  • Повторное использование: Вынос общих шагов в базовые образы (base images) для всех сервисов проекта.
  • Динамическая конфигурация: Использование ARG и ENV для параметризации сборки под разные окружения.