Консультация Oblako.kz

Создание образа из Dockerfile

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

По умолчанию Docker ожидает найти файл с именем Dockerfile (без расширения) в корне контекста сборки. Это удобно: достаточно выполнить команду docker build -t my-image ., где -t — это тег, который будет присвоен собранному образу, а . — путь к контексту сборки (контекст берется из текущей директории). Контекст сборки — это набор файлов и директорий, к которым Docker имеет доступ во время сборки и из которых можно копировать данные инструкциями COPY и ADD. Обычно это текущая директория, но можно указать любой путь или URL.

Если в проекте используется несколько файлов для разных целей (например, Dockerfile, api.Dockerfile, dev.Dockerfile), нужный файл можно указать флагом --file (или коротко -f): docker build -t my-api -f api.Dockerfile ..

Важно, что --file выбирает только Dockerfile, а контекст сборки по-прежнему задается последним аргументом (. в примере выше).

Пример сборки образа из Dockerfile

Создадим Dockerfile и соберем образ проекта DPDG (https://github.com/Pseudolukian/DPDG) — генератора фейковых персональных данных в различных форматах для тестирования SQL-баз данных. Под капотом у DPDG: FastAPI, Gunicorn, Pydantic и самописный веб-интерфейс, реализованный отдельным Python-скриптом.

В базовом для нашей сборки Python-скрипте (https://github.com/Pseudolukian/DPDG/blob/master/web.py) указано, что приложение слушает порт 8000, поэтому мы применим инструкцию EXPOSE 8000. Также для работы приложения нам понадобится множество Python-пакетов, которые мы установим инструкцией RUN из файла requirements.txt, который будет скопирован в образ инструкцией COPY.

Основной Python-скрипт — наша точка входа — будет установлен инструкцией ENTRYPOINT, а все переиспользуемые параметры будут вынесены в инструкции ARG.

В итоге Dockerfile для сборки образа DPDG будет выглядеть так:

# Указываем базовый образ Python
FROM python:3.10.12-slim

# Задаем переменные сборки
ARG APP_DIR=/app
ARG DATA_DIR=static/generated_content
ARG APP_PORT=8000

# Устанавливаем рабочую директорию
WORKDIR ${APP_DIR}

# Копируем файл зависимостей
COPY requirements.txt .

# Устанавливаем зависимости Python
RUN pip3 install --no-cache-dir --upgrade pip && \
    pip3 install --no-cache-dir -r requirements.txt

# Копируем все файлы проекта в контейнер
COPY . .

# Создаем директорию для сгенерированного контента
RUN mkdir -p ${DATA_DIR}

# Объявляем том для хранения сгенерированных данных
VOLUME ${APP_DIR}/${DATA_DIR}

# Преобразуем ARG в ENV для использования во время выполнения
ENV PORT=${APP_PORT}

# Открываем порт для веб‑приложения
EXPOSE ${APP_PORT}

# Задаем точку входа — uvicorn как основной процесс
ENTRYPOINT ["uvicorn", "web:app", "--host", "0.0.0.0"]

# Аргументы по умолчанию (можно переопределить при запуске)
CMD ["--port", "8000"]

Образ собирается командой docker build -t dpdg-web .. После сборки образ будет отражаться в списке доступных локальных образов командой docker images ls. Узнать, какие инструкции были выполнены при сборке образа, можно с помощью команды docker images history image_name, а если нужно получить более детальную информацию — выполнить команду docker images inspect image_name.

Запуск контейнера

Контейнеры создаются командой docker run, которая имеет множество опций запуска контейнера. Подробная инструкция о том, как работать с docker run, находится в отдельном разделе.

В Dockerfile у нас указана точка монтирования тома (VOLUME ${APP_DIR}/${DATA_DIR}), поэтому при создании контейнера нужно указать том, куда будут сохраняться файлы с данными (-v dpdg-data:/app/static/generated_content). Также нужно смаппить внешний порт с внутренним портом контейнера, который слушает приложение (-p 9100:8000).

В финале команда для запуска контейнера будет выглядеть так:

docker run -d \
    -p 9100:8000 \
    -v dpdg-data:/app/static/generated_content \
    --name dpdg-container \
    dpdg-web

После запуска веб-приложение будет доступно по адресу http://localhost:9100.

Последнее обновление: 04.02.2026