Определение простыми словами
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.