Что такое Dockerfile и каковы его основные инструкции

Ответ

Dockerfile — это текстовый документ, содержащий набор инструкций для автоматической сборки образа Docker. Каждая инструкция создает новый слой в образе.

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

  • FROM: Указывает базовый образ, на основе которого будет строиться новый (например, ubuntu:22.04 или python:3.10-slim).
  • WORKDIR: Устанавливает рабочую директорию для последующих инструкций (RUN, CMD, COPY).
  • COPY: Копирует файлы и директории из хост-системы в файловую систему контейнера.
  • RUN: Выполняет команды в новом слое образа на этапе сборки. Часто используется для установки пакетов (RUN apt-get update && apt-get install -y ...).
  • ENV: Устанавливает переменные окружения.
  • EXPOSE: Информирует Docker о том, что контейнер прослушивает указанные сетевые порты. Не публикует порт, а служит документацией.
  • CMD: Задает команду, которая будет выполнена при запуске контейнера. Может быть переопределена при запуске (docker run image_name new_command).
  • ENTRYPOINT: Конфигурирует контейнер для запуска как исполняемый файл. Команды, переданные через docker run, будут добавлены как аргументы к ENTRYPOINT.

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

# 1. Указываем базовый образ
FROM python:3.10-slim-buster

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

# 3. Устанавливаем переменные окружения
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# 4. Копируем зависимости и устанавливаем их
# Этот шаг выполняется отдельно для кэширования слоев
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

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

# 6. Указываем команду для запуска приложения
CMD ["python", "main.py"]

Ключевые практики:

  • Минимизация размера образа: Используйте легковесные базовые образы (alpine, slim).
  • Кэширование слоев: Располагайте инструкции, которые меняются редко (например, установка зависимостей), перед теми, которые меняются часто (копирование исходного кода).
  • Многоэтапные сборки (Multi-stage builds): Используются для компилируемых языков, чтобы в финальном образе оставить только артефакты сборки, а не весь сборочный инструментарий.