Dockerfile — конфигурационный файл для сборки Docker-образа. Содержит последовательность инструкций, каждая из которых добавляет слой в итоговый образ. Образ собирается командой docker build -t myapp:1.0 .. Dockerfile обеспечивает воспроизводимость: один и тот же файл даёт одинаковый результат на любом хосте.
Основные инструкции
FROM ubuntu:22.04 # базовый образ
WORKDIR /app # рабочая директория
COPY requirements.txt . # копирование файлов
RUN pip install -r requirements.txt # выполнение команды
COPY . . # копирование кода
EXPOSE 8000 # объявление порта
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Как работает
Docker кэширует каждый слой. Если инструкция и её контекст не изменились, Docker использует кэш — это ускоряет повторные сборки. Поэтому зависимости (COPY requirements.txt + RUN pip install) должны идти до копирования кода (COPY . .): при изменении только кода зависимости не пересобираются.
Multi-stage build — сборка в несколько этапов для уменьшения итогового образа: в первом stage компилируется код, во втором — копируется только результат. Образ Go-приложения с multi-stage build: 10–20 МБ вместо 800 МБ.
История
Docker и формат Dockerfile появились в 2013 году (компания dotCloud, позже переименована в Docker Inc.). Формат Dockerfile заимствовал идеи из Chef, Puppet и shell-скриптов. OCI (Open Container Initiative) стандартизировала формат образов в 2016 году. Podman и BuildKit поддерживают Dockerfile-формат без Docker-демона.
Связь с хостингом
Dockerfile — основа CI/CD-пайплайнов. GitHub Actions, GitLab CI и Jenkins собирают образы из Dockerfile и публикуют в реестр (Docker Hub, GitHub Container Registry, Yandex Container Registry). На VPS образы разворачиваются через docker run или Docker Compose. В Kubernetes — через манифест Deployment с указанием image.
Инструкции Dockerfile
FROM — базовый образ. RUN — выполнить команду. COPY/ADD — скопировать файлы. WORKDIR — рабочая директория. EXPOSE — задокументировать порт (не открывает). ENV — переменные окружения. CMD/ENTRYPOINT — команда при запуске. ARG — аргументы сборки.
Best practices
Multi-stage build: отдельный build-контейнер + минимальный runtime-образ. COPY requirements.txt . перед COPY . . — кэш слоя зависимостей. .dockerignore — исключить node_modules, .git, *.log. Базовый образ: alpine (5 МБ) или distroless (без shell). Не запускать от root: USER appuser.
Dockerfile для типичных стеков
Node.js: FROM node:18-alpine → COPY package*.json → npm ci --production → COPY . . → CMD [""node"", ""server.js""]. Python: FROM python:3.11-slim → pip install → COPY app. Go: multi-stage FROM golang → build → FROM scratch → COPY binary. Финальный образ Go — 5–15 МБ.
Dockerfile Security Scanning
Trivy: trivy image myapp:latest — сканирование на CVE. Hadolint: линтер для Dockerfile. USER nonroot — запуск от непривилегированного пользователя. Distroless образы (Google): нет shell, минимальная поверхность атаки. COPY вместо ADD для файлов (ADD может разворачивать архивы неожиданно).
OCI и Buildah
Buildah: daemonless сборка OCI-образов без Docker daemon. Rootless сборка. Совместим с Dockerfile (buildah bud) и Shell API (buildah run). Kaniko: сборка в Kubernetes без privileged-доступа. Для CI/CD в Kubernetes: Kaniko или Buildah предпочтительнее Docker-in-Docker (DinD).
Dockerfile строит образы для запуска в Docker-контейнерах. Образы хранятся в container registry. CI/CD автоматизирует сборку. Kubernetes запускает контейнеры из образов. Nginx-образ — базовый для веб-серверов. Podman — альтернатива Docker без демона.