Что такое Dockerfile?

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

Ответ

Dockerfile — это текстовый файл-инструкция, содержащий последовательность команд для автоматической сборки Docker-образа. Он описывает, как создать воспроизводимое и переносимое окружение для приложения, включая базовую ОС, зависимости, код и команду запуска.

Основные инструкции Dockerfile:

  • FROM: Задает базовый образ (например, FROM ubuntu:22.04, FROM python:3.11-slim). Всегда первая инструкция.
  • RUN: Выполняет команду в слое образа во время сборки (установка пакетов, компиляция).
    RUN apt-get update && apt-get install -y curl
  • COPY / ADD: Копирует файлы и директории с хоста (локальной машины) в образ. ADD имеет дополнительные функции (распаковка архивов, загрузка по URL), но COPY предпочтительнее для ясности.
    COPY ./app /opt/app
    COPY requirements.txt .
  • WORKDIR: Устанавливает рабочую директорию для всех последующих инструкций (RUN, CMD, ENTRYPOINT, COPY).
  • ENV: Устанавливает переменные окружения внутри контейнера.
  • EXPOSE: Информирует Docker, что контейнер слушает указанные сетевые порты (не открывает их на хосте).
  • CMD: Определяет команду по умолчанию для запускаемого контейнера. Может быть переопределена при запуске контейнера. В форме exec: CMD ["executable", "param1", "param2"].
  • ENTRYPOINT: Настраивает контейнер как исполняемый файл. Аргументы CMD становятся аргументами для ENTRYPOINT.

Пример Dockerfile для Python-приложения:

# Используем официальный легковесный образ Python
FROM python:3.11-slim

# Устанавливаем рабочую директорию
WORKDIR /app

# Копируем файл зависимостей
COPY requirements.txt .

# Устанавливаем зависимости
RUN pip install --no-cache-dir -r requirements.txt

# Копируем весь исходный код приложения
COPY . .

# Объявляем порт, который использует приложение
EXPOSE 8000

# Команда для запуска приложения (например, через Gunicorn)
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "wsgi:app"]

Роль Dockerfile в процессах QA/Тестирования:

  1. Воспроизводимость окружения: Гарантирует, что разработчики, тестировщики и CI-сервер запускают приложение в идентичном окружении, устраняя проблему "у меня работает".
  2. Изоляция тестов: Позволяет запускать тесты в чистых, изолированных контейнерах, не влияя на основную систему.
  3. Интеграция в CI/CD: Dockerfile — основа для этапа сборки (build) в конвейере. После сборки образа в нем запускаются юнит- и интеграционные тесты.
  4. Тестирование разных конфигураций: Можно создавать несколько Dockerfile или использовать многоэтапные сборки (multi-stage builds) для тестирования приложения с разными версиями зависимостей или в разных средах (dev/stage).
  5. Автоматизация развертывания тестовых стендов: С помощью Docker Compose или оркестраторов (Kubernetes) можно быстро поднимать сложные тестовые среды с БД, кэшем, брокерами сообщений.