Ответ
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): Используются для компилируемых языков, чтобы в финальном образе оставить только артефакты сборки, а не весь сборочный инструментарий.