Команда 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.