4.1 Основы команды docker build
Команда docker build — это основной способ создать Docker-образ из Dockerfile. Она берет инструкции из Dockerfile и по шагам выполняет их, формируя образ из слоев. В этой лекции мы разберем, как работает команда docker build, какие у нее есть параметры и как её использовать на практике.
Команда docker build собирает образ из Dockerfile и так называемого контекста сборки. Контекст сборки — это файлы, которые Docker использует для создания образа. Это может быть локальная папка на вашей машине или, например, репозиторий на GitHub.
Синтаксис
docker build [OPTIONS] PATH | URL | -
Где:
-
PATH: путь к директории, содержащей Dockerfile и контекст сборки. URL: URL-адрес удаленного репозитория.-: чтение Dockerfile из стандартного ввода (stdin).
Пример базового использования
В этом примере Docker будет использовать Dockerfile из текущей директории (.) и создаст образ с именем myimage и тегом latest.
docker build -t myimage:latest .
4.2 Кастомизация команды build
Основные параметры команды docker build
Команда docker build поддерживает множество опций, которые позволяют настроить процесс сборки.
1. Параметры -t, --tag
Параметр -t или --tag используется для присвоения имени и тега создаваемому образу.
docker build -t myimage:latest .
2. Параметры -f, --file
Параметр -f или --file позволяет указать альтернативный Dockerfile, если он отличается от стандартного Dockerfile.
docker build -f Dockerfile.dev -t myimage:dev .
3. Параметр --build-arg
Параметр --build-arg используется для передачи аргументов сборки, определенных с помощью инструкции ARG в Dockerfile.
docker build --build-arg APP_VERSION=1.0 -t myimage:1.0 .
4. Параметр --no-cache
Параметр --no-cache позволяет выполнить сборку без использования кэша. Это полезно, если нужно убедиться, что все команды выполняются заново.
docker build --no-cache -t myimage:latest .
5. Параметр --target
Параметр --target используется для указания целевого этапа в многоэтапной сборке.
docker build --target builder -t myimage:builder .
6. Параметр --rm
Параметр --rm указывает Docker удалить промежуточные контейнеры после успешной сборки образа (по умолчанию включена).
docker build --rm -t myimage:latest .
4.3 Примеры docker build
Пример 1: Базовая сборка
Предположим, у вас есть простое приложение на Node.js, и вы хотите создать Docker-образ для его развертывания.
Dockerfile:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
Команда сборки:
docker build -t mynodeapp:latest .
В этом примере Docker создаст образ mynodeapp с тегом latest, используя Dockerfile из текущей директории.
Пример 2: Сборка с использованием аргументов
Аргументы сборки позволяют передавать переменные в Dockerfile во время сборки.
Dockerfile
FROM node:14
ARG APP_VERSION
ENV APP_VERSION=${APP_VERSION}
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
Команда сборки:
docker build --build-arg APP_VERSION=1.0 -t mynodeapp:1.0 .
В этом примере аргумент APP_VERSION передается в Dockerfile, что позволяет задавать версию приложения во время сборки.
Пример 3: Многоэтапная сборка
Многоэтапная сборка используется для создания образов, которые включают только необходимые компоненты. Это позволяет уменьшить размер финального образа.
Dockerfile
# Этап сборки
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Формирование финального образа с минимальным набором файлов
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
Команда сборки:
docker build -t mywebapp:latest .
В этом примере сначала создается промежуточный образ builder, в котором происходит сборка приложения. После сборки приложение переносится в финальный образ, в котором используется Nginx для обслуживания готового контента.
4.4 Практические советы
1. Оптимизация порядка инструкций
Для эффективного использования кэша Docker важно правильно упорядочить инструкции. Например, сначала копируйте файлы, которые редко изменяются, такие как package.json, чтобы минимизировать пересборку зависимостей. Затем выполняйте копирование остальных файлов.
COPY package*.json ./
RUN npm install
COPY . .
2. Использование .dockerignore
Добавьте файл .dockerignore, чтобы исключить ненужные файлы и директории из контекста сборки. Это уменьшит размер контекста и ускорит сборку образа.
Пример .dockerignore:
node_modules
dist
*.log
3. Многоэтапная сборка
Применяйте многоэтапную сборку для создания минималистичных и легковесных образов. Этот подход позволяет включать только те файлы и зависимости, которые действительно необходимы для работы приложения, исключая из финального образа лишние данные, такие как временные файлы или исходный код.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ