Dockerfile — текстовый файл с инструкциями, по которым Docker собирает образ контейнера.
С помощью Dockerfile можно описать:
- базовый образ;
- установку зависимостей;
- копирование исходного кода;
- переменные окружения;
- рабочую директорию;
- команду запуска приложения.
Dockerfile особенно полезен, когда готового образа нужного приложения нет или требуется собственная конфигурация.
Простейший Dockerfile
Создадим файл:
Dockerfile
Содержимое:
FROM nginx:alpine
COPY ./site /usr/share/nginx/html
Соберем образ:
docker build -t my-site .
Запустим:
docker run -d \
--name my-site \
-p 8080:80 \
my-site
Инструкция FROM
FROM определяет базовый образ:
FROM nginx:alpine
Можно использовать официальный образ языка программирования:
FROM python:3.13-slim
или:
FROM node:24-alpine
Конкретную версию лучше фиксировать, а не использовать бездумно latest.
COPY
Копирует файлы из build context в образ:
COPY . /app
Часто не стоит копировать абсолютно весь каталог проекта. Для этого используется .dockerignore.
WORKDIR
Определяет рабочий каталог:
WORKDIR /app
После этого относительные пути выполняются относительно /app.
RUN
Команда RUN выполняется во время сборки.
Например:
RUN apt-get update && apt-get install -y curl
Не следует оставлять лишние кэш-файлы пакетов внутри образа.
CMD
Определяет команду по умолчанию:
CMD ["python", "app.py"]
ENTRYPOINT
ENTRYPOINT позволяет определить основной исполняемый процесс контейнера:
ENTRYPOINT ["python"]
На практике CMD и ENTRYPOINT могут использоваться вместе.
EXPOSE
Например:
EXPOSE 8080
Это документирует порт приложения, но само по себе не публикует его на хост.
Для публикации используется:
docker run -p 8080:8080 image
ENV
Можно задать переменную:
ENV APP_ENV=production
Но секреты — пароли, токены и ключи — не следует встраивать в Dockerfile.
.dockerignore
Пример:
.git
node_modules
.env
*.log
tmp
Это уменьшает build context и не позволяет случайно отправить в сборку лишние или чувствительные файлы.
Multi-stage build
Для приложений с компиляцией полезны многоэтапные сборки.
Например:
FROM node:24-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
В результате финальный образ содержит только необходимые для запуска файлы.
Dockerfile и Docker Compose
Compose может собирать Dockerfile:
services:
app:
build: .
ports:
- "8080:8080"
Запуск:
docker compose up -d --build
Это удобно для веб-приложений.
Хорошие практики
Используйте минимальный базовый образ
Например:
alpine
slim
если они совместимы с приложением.
Фиксируйте версии
Вместо:
FROM node:latest
лучше использовать конкретную версию.
Не храните секреты
Не добавляйте:
ENV DB_PASSWORD=supersecret
Не запускайте приложение от root без необходимости
Создайте отдельного пользователя, если это поддерживает приложение.
Используйте .dockerignore
Это помогает уменьшить контекст сборки и избежать попадания ненужных файлов.
Проверка образа
После сборки:
docker images
Посмотреть историю:
docker history my-site
Проверить конфигурацию:
docker inspect my-site
Типичные ошибки
Большой образ
Частая причина — установка лишних пакетов и копирование всего проекта.
Секреты в образе
Даже если удалить секрет из последующего слоя, он может остаться в истории образа.
Использование latest
Такой тег может неожиданно измениться.
Приложение работает только с localhost
Если приложение слушает только 127.0.0.1 внутри контейнера, внешний доступ может не работать. Обычно приложение должно слушать подходящий адрес, например 0.0.0.0.
Итог
Dockerfile превращает описание приложения в воспроизводимый Docker-образ. Вместе с Compose он позволяет описать практически всю структуру приложения и инфраструктуры как код.
Читайте также:



