Dockerfile: как создать собственный Docker-образ - Компьюти
Logo КОМПЬЮТИ

Dockerfile: как создать собственный Docker-образ

Время на прочтение: 2 мин.

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 он позволяет описать практически всю структуру приложения и инфраструктуры как код.

Читайте также:


Читайте также:

Приглашаем поучаствовать в обсуждении статьи:

Комментариев 0