логотип PurpleSchool
логотип PurpleSchool

Передача аргументов при сборке образов в Docker

Автор

Иван Петров

Введение

Docker преобразовал процесс развертывания приложений, сделав его быстрым и эффективным. Однако, гибкость сборки Docker-образов требует понимания некоторых ключевых функций, одной из которых является передача аргументов. Эти аргументы позволяют вам настраивать различные элементы процесса сборки, делая его более адаптируемым и управляемым. Данная статья раскроет, как именно можно передавать аргументы при сборке образов в Docker, зачем это нужно и какие преимущества это даёт.

Аргументы сборки и их назначение

Передача аргументов в Docker - это способ кастомизации сборки образов. Это удобно, когда вы хотите создать образы с изменяемыми параметрами без изменения исходного кода Dockerfile. Аргументы передаются через опцию --build-arg, и в Dockerfile они обозначаются с помощью инструкции ARG. Это делает процесс сборки более гибким и позволяет использовать одни и те же Dockerfile для различных сценировок и окружений.

Основы инструкции ARG

Инструкция ARG в Dockerfile объявляет переменную, которую можно задать значением во время сборки образа. Значение этой переменной можно передавать из командной строки с помощью docker build.

# Объявляем аргумент MY_VAR
ARG MY_VAR

# Используем аргумент в команде ENV
ENV MY_ENV_VAR=$MY_VAR

Здесь мы объявили аргумент MY_VAR и использовали его для установки переменной окружения MY_ENV_VAR. Во время сборки вы можете передать значение для MY_VAR с помощью --build-arg.

Передача аргументов через командную строку

Аргументы передаются во время сборки с использованием флага --build-arg. Это позволяет задавать или изменять параметры напрямую из командной строки и контролировать сборочный процесс на различных этапах.

docker build --build-arg MY_VAR=value -t my-image .

В этой команде --build-arg MY_VAR=value передает значение value в переменную MY_VAR. Таким образом, вы гибко управляете сборочным процессом без изменения Dockerfile.

Пример использования аргументов сборки

Давайте посмотрим на более полный пример, чтобы закрепить знания.

Подготовка Dockerfile

Рассмотрим пример Dockerfile, где мы используем аргументы для настройки источника и версии приложения.

# Объявляем аргументы
ARG REPO_URL
ARG APP_VERSION

# Базовый образ
FROM alpine:latest

# Устанавливаем рабочую директорию
WORKDIR /app

# Используем аргументы для клонирования репозитория и установки версии
RUN apk add --no-cache git && \
    git clone $REPO_URL && \
    cd app && git checkout $APP_VERSION

Сборка с передачей аргументов

Теперь вы сможете передать конкретные значения для REPO_URL и APP_VERSION во время сборки.

docker build --build-arg REPO_URL=https://github.com/your-repo.git --build-arg APP_VERSION=v1.0 -t custom-app .

Эта команда создаст образ, который клонирует указанный репозиторий и проверяет конкретную версию приложения.

Особенности и ограничения

Стоит заметить, что аргументы, объявленные с помощью ARG, доступны только на этапе сборки и не сохраняются в конечном образе. Они обеспечивают конфиденциальность, так как чувствительные данные не передаются в готовый образ.

Кэширование и ARG

При использовании аргументов сборки важно учитывать вопрос кэширования. Если значение аргумента изменится, все последующие команды после ARG будут выполнены заново, так как кэш Docker становится недействительным для этих слоев. Это может повлиять на производительность сборки, особенно при частой необходимости изменять значения аргументов.

Заключение

Передача аргументов при сборке образов в Docker представляет собой мощный механизм, который улучшает управление процессом создания образов и делает его гибким. Знание того, как использовать аргументы сборки и понимание их ограничений, позволит вам эффективно адаптировать Dockerfile под различные сценарии и окружения. Используйте аргументы для оптимизации процессов и повышения адаптивности ваших разработок, и вы ощутите все преимущества этой функциональности Docker.

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile