Dockerfile: что это, синтаксис и примеры — глоссарий | Глоссарий FREEHOSTING

Dockerfile

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

Определение простыми словами

Dockerfile — это рецепт сборки Docker-образа. В нём построчно описано, из какого базового образа стартовать, какие пакеты поставить, какой код скопировать, какие порты открыть и какую команду выполнить при запуске контейнера. Каждая инструкция формирует отдельный слой; слои кэшируются, поэтому повторная сборка после изменения только одного шага идёт за секунды.

Dockerfile хранится в корне репозитория рядом с кодом. Это позволяет описывать инфраструктуру декларативно и держать её под версионным контролем вместе с приложением.

Сравнение

Подход Скорость сборки Воспроизводимость Когда выбрать
Dockerfile Высокая (кэш слоёв) Полная Любые контейнерные приложения
docker commit Низкая, ручная Слабая Разовые эксперименты
Buildpacks Средняя Средняя Стандартные стеки без кастома
Packer Низкая Высокая VM-образы, не контейнеры

Кейсы использования

  • Сборка образа web-приложения на Node.js, Python, Go или PHP с фиксированными версиями зависимостей.
  • Подготовка окружения для CI/CD: один и тот же образ собирается в pipeline и деплоится в продакшен.
  • Многоступенчатая сборка (multi-stage), при которой итоговый образ содержит только бинарник без компилятора.
  • Образы для baseimage микросервисов, использующиеся в docker-compose и Kubernetes.

Когда Dockerfile неуместен: для управления конфигурацией ОС на bare-metal (используют Ansible, Chef), для упаковки десктопных GUI-приложений с проприетарными драйверами, для образов виртуальных машин — там нужен Packer или cloud-init.

Технические детали

Минимальный Dockerfile для приложения на Python:

FROM python:3.12-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENV APP_ENV=production
EXPOSE 8000

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

Сборка и запуск:

docker build -t myapp:1.0 .
docker run -d -p 8000:8000 --name myapp myapp:1.0

Каждая инструкция (FROM, RUN, COPY, CMD) создаёт слой. Чтобы уменьшить размер образа, объединяйте команды через &&, чистите кэш менеджера пакетов и используйте multi-stage build. Базовые образы лучше брать в alpine или slim-вариантах. Подробнее о работе со слоями и реестрами — в статье Docker.

Частые вопросы

Чем Dockerfile отличается от docker-compose.yml?

Dockerfile описывает сборку одного образа, docker-compose.yml — запуск и связи нескольких готовых контейнеров. Compose часто использует образы, собранные из Dockerfile.

Можно ли использовать несколько FROM в одном Dockerfile?

Да, это называется multi-stage build. Используется, чтобы собирать приложение в одном образе, а в финальный класть только результат — без компиляторов и dev-зависимостей.

Как уменьшить размер итогового образа?

Берите slim или alpine-базы, объединяйте RUN-команды, удаляйте кэш apt/pip в той же инструкции, используйте .dockerignore и multi-stage сборку.

Где хранить Dockerfile в проекте?

В корне репозитория. Если в проекте несколько сервисов — в подпапках с понятными именами (api/, worker/, web/) и одним общим docker-compose.yml.