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

Аргументы в Docker

Автор

Олег Марков

Введение

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

Аргументы в Dockerfile

Аргументы в Docker позволяют передавать параметры в Dockerfile, чтобы сделать сборку контейнера более гибкой и повторяемой. Они определяются с помощью инструкции ARG и используются для установки значений, которые могут быть изменены в процессе сборки контейнера.

Синтаксис

Для объявления аргумента в Dockerfile используется инструкция ARG, за которой следует имя аргумента. Мы также можем указать значение по умолчанию, если значение аргумента не будет передано при сборке.

# Объявляем аргумент с именем VERSION
ARG VERSION=latest

Теперь давайте посмотрим, как использовать объявленный аргумент в других инструкциях Dockerfile:

# Используем аргумент VERSION для установки тега образа
FROM nginx:${VERSION}

В этом примере аргумент VERSION используется для определения версии образа, который мы будем использовать в качестве базового. Это позволяет легко менять версию без изменения Dockerfile.

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

Аргументы передаются в команду docker build с использованием флага --build-arg. Здесь я покажу, как передать значение аргумента при сборке:

docker build --build-arg VERSION=1.21.1 -t my-nginx .

В этом случае вместо использования значения по умолчанию latest, используется версия 1.21.1.

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

Теперь давайте разберемся на примерах, как аргументы в Docker могут быть полезны в различных ситуациях.

Управление конфигурацией приложения

Аргументы часто применяются для управления конфигурацией приложения, которая может изменяться в зависимости от окружения. Например, вы можете использовать аргумент для установки режима работы приложения:

# Объявление аргумента ENVIRONMENT
ARG ENVIRONMENT=development

# Использование аргумента в инструкциях
ENV NODE_ENV=${ENVIRONMENT}

Здесь мы задаем переменную окружения NODE_ENV, которая определяет режим работы приложения (например development, production и т.д.). Это позволяет вам при сборке определять, в каком окружении будет запускаться контейнер:

docker build --build-arg ENVIRONMENT=production -t my-app .

Оптимизация многослойной сборки

Аргументы могут использоваться для оптимизации размера и слоистости ваших Docker-образов. Это достигается путем использования аргументов для оптимизации кэширования слоев.

# Объявление аргумента CACHEBUST
ARG CACHEBUST=1

RUN curl -o /somefile.txt https://example.com/data?version=${CACHEBUST}

В этом примере аргумент CACHEBUST используется для манипуляции URL, чтобы гарантировать обновление слоя при изменении содержимого, на которое ссылается URL.

Множественные сборки в одном Dockerfile

Аргументы также могут быть полезны в ситуациях, когда у вас есть несколько вариантов сборки в одном Dockerfile. Это часто встречается при использовании так называемых multi-stage builds.

# Объявление аргумента для стадии сборки
ARG STAGE=development

FROM node:14 AS base
WORKDIR /app

COPY package*.json ./

RUN npm install

FROM base AS ${STAGE}

COPY . .

CMD ["node", "server.js"]

Здесь мы видим примеры multistage-сборок, где значение аргумента STAGE определяет, какая стадия будет использована.

Заключение

Аргументы в Docker играют важную роль в создании гибких, повторяемых и безопасных процессов сборки контейнеров. Они позволяют передавать переменные в Dockerfile, облегчая настройку и изменяемость параметров на разных стадиях разработки и развертывания. Будьте внимательны при использовании аргументов и сохраняйте их конфиденциальность, так как они могут быть видны в истории сборки образа. Надеюсь, что эта статья помогла вам понять возможности и применение аргументов в Docker, и теперь вы сможете более эффективно использовать их в своей работе.

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

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