docker build — собираем Docker образ из Dockerfile

docker build читает Dockerfile и создаёт из него образ. Это превращает твой код в переносимый артефакт который одинаково запускается на любом сервере с Docker.

Вся рубрика Docker: уроки, команды и практические сценарии

Базовый синтаксис

docker build [ФЛАГИ] ПУТЬ_К_КОНТЕКСТУ

# Собрать из текущей папки (точка = контекст)
docker build .

# С тегом (именем и версией)
docker build -t myapp:1.0 .
docker build -t myapp:latest .

# Несколько тегов за один build
docker build -t myapp:1.0.0 -t myapp:latest .

# Из другой папки
docker build -t myapp /path/to/project

# Другой Dockerfile (не Dockerfile по умолчанию)
docker build -t myapp -f Dockerfile.prod .
docker build -t myapp -f docker/Dockerfile.dev .

Что такое контекст сборки

# Структура проекта
myproject/
├── app.py
├── requirements.txt
├── Dockerfile
└── .dockerignore   ← важно!

# Когда запускаешь:
docker build .
# Точка — контекст сборки.
# Docker отправляет ВСЁ содержимое папки в Docker daemon.
# .dockerignore исключает ненужные файлы (node_modules, .git, логи).

Чем меньше контекст — тем быстрее сборка. Файл .dockerignore — обязателен для проектов с node_modules или большим количеством файлов.

Теги и версионирование образов

# Тег = имя:версия
docker build -t myapp:1.0.0 .
docker build -t myapp:1.0 .
docker build -t myapp:latest .

# С registry (Docker Hub)
docker build -t username/myapp:1.0 .
docker build -t username/myapp:latest .

# С приватным registry
docker build -t registry.company.com/myapp:1.0 .

# Проверить созданные образы
docker images | grep myapp
# myapp    1.0.0     abc123   2 minutes ago   145MB
# myapp    latest    abc123   2 minutes ago   145MB

Build arguments (ARG)

# В Dockerfile объявить ARG
ARG NODE_VERSION=20
FROM node:${NODE_VERSION}-alpine

ARG APP_ENV=production
ENV NODE_ENV=${APP_ENV}
# Передать значение при сборке
docker build --build-arg NODE_VERSION=18 -t myapp .
docker build --build-arg APP_ENV=development -t myapp-dev .

# Несколько аргументов
docker build \
  --build-arg NODE_VERSION=20 \
  --build-arg APP_ENV=production \
  -t myapp:1.0 .

Кэш слоёв — как работает

# Docker кэширует каждый слой
docker build -t myapp .
# Step 1/6 : FROM python:3.12-slim
# Step 2/6 : WORKDIR /app
# Step 3/6 : COPY requirements.txt .
# Step 4/6 : RUN pip install...
# Step 5/6 : COPY . .              ← изменили код
# Step 6/6 : CMD ["python", "app.py"]

# Пересборка: шаги 1-4 из кэша (быстро), 5-6 заново
docker build -t myapp .
# Step 1/6 ... Using cache
# Step 2/6 ... Using cache
# Step 3/6 ... Using cache
# Step 4/6 ... Using cache  ← pip install не запускается!
# Step 5/6 ... (заново — код изменился)

# Отключить кэш (чистая сборка)
docker build --no-cache -t myapp .

Полный цикл: build → run → push

# 1. Написать Dockerfile

# 2. Собрать образ
docker build -t my-flask-app:1.0 .

# 3. Проверить что образ создался
docker images | grep my-flask-app
# my-flask-app   1.0   abc123   30 seconds ago   145MB

# 4. Запустить и проверить
docker run -d -p 5000:5000 --name test-app my-flask-app:1.0
curl http://localhost:5000
docker logs test-app

# 5. Тегировать для Docker Hub
docker tag my-flask-app:1.0 username/my-flask-app:1.0

# 6. Войти и загрузить
docker login
docker push username/my-flask-app:1.0

# 7. Удалить тестовый контейнер
docker rm -f test-app

Часто задаваемые вопросы

Что значит точка в конце docker build?

Точка указывает на контекст сборки — папку, содержимое которой отправляется в Docker daemon. Это не значит «искать Dockerfile в текущей папке» — хотя по умолчанию Docker ищет файл с именем Dockerfile именно в контексте. Можно указать другой путь: docker build /path/to/context. Или другой Dockerfile: docker build -f path/Dockerfile .

Как ускорить docker build?

Три правила: 1) Правильный порядок инструкций — сначала COPY зависимостей и их установка, потом COPY кода. Тогда при изменении кода зависимости не пересобираются. 2) .dockerignore — исключить node_modules, .git, логи из контекста. 3) slim/alpine образы — меньше загружать и собирать. BuildKit (включён по умолчанию в Docker 23+) также ускоряет сборку через параллельные шаги.

docker build vs docker compose build?

docker build собирает один конкретный образ из Dockerfile. docker compose build собирает все сервисы из docker-compose.yml у которых указан build: вместо image:. docker compose up --build — пересобрать и запустить. Используй docker compose build когда работаешь с многосервисным приложением через Compose.

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x