Настройка переменных среды в экземплярах контейнеров

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

Чтобы установить переменные среды в контейнере, укажите их при создании экземпляра контейнера. В данной статье представлены примеры настройки переменных среды при запуске контейнера с помощью Azure CLI, Azure PowerShell и на портале Azure.

Например, если используется образ контейнера Microsoft aci-wordcount, вы можете изменить его поведение, указав следующие переменные среды:

NumWords задает число слов для вывода в STDOUT.

MinLength обозначает минимальную длину учитываемых слов в символах. Если увеличить это значение, скрипт будет пропускать самые распространенные слова, например of и the.

Если нужно передать секреты в качестве переменных среды, служба "Экземпляры контейнеров Azure" поддерживает безопасные значения для контейнеров Windows и Linux.

Примечание

Для взаимодействия с Azure рекомендуется использовать модуль Azure Az PowerShell. Чтобы начать работу, см. статью Установка Azure PowerShell. Дополнительные сведения см. в статье Перенос Azure PowerShell с AzureRM на Az.

Пример для Azure CLI

Для просмотра выходных данных контейнера aci-wordcount, установленных по умолчанию, сначала запустите его с помощью команды az container create (переменные среды не заданы):

az container create \
    --resource-group myResourceGroup \
    --name mycontainer1 \
    --image mcr.microsoft.com/azuredocs/aci-wordcount:latest \
    --restart-policy OnFailure

Чтобы изменить выходные данные, запустите второй контейнер с добавленным аргументом --environment-variables, указав значения для переменных NumWords и MinLength. (В этом примере предполагается, что вы используете CLI в оболочке Bash или Azure Cloud Shell. При использовании командной строки Windows указывайте переменные с двойными кавычками, например --environment-variables "NumWords"="5" "MinLength"="8".)

az container create \
    --resource-group myResourceGroup \
    --name mycontainer2 \
    --image mcr.microsoft.com/azuredocs/aci-wordcount:latest \
    --restart-policy OnFailure \
    --environment-variables 'NumWords'='5' 'MinLength'='8'

Как только состояние обоих контейнеров станет Terminated (Завершен) (используйте az container show для проверки состояния), откройте их журналы с помощью az container logs, чтобы просмотреть выходные данные.

az container logs --resource-group myResourceGroup --name mycontainer1
az container logs --resource-group myResourceGroup --name mycontainer2

Выходные данные контейнеров показывают, как вы изменили поведение скрипта второго контейнера, установив переменные среды.

mycontainer1

[('the', 990),
 ('and', 702),
 ('of', 628),
 ('to', 610),
 ('I', 544),
 ('you', 495),
 ('a', 453),
 ('my', 441),
 ('in', 399),
 ('HAMLET', 386)]

mycontainer2

[('CLAUDIUS', 120),
 ('POLONIUS', 113),
 ('GERTRUDE', 82),
 ('ROSENCRANTZ', 69),
 ('GUILDENSTERN', 54)]

Пример для Azure PowerShell

Установка переменных среды в PowerShell аналогична действиям в CLI, за исключением использования аргумента командной строки -EnvironmentVariable.

Сначала запустите контейнер aci-wordcount в конфигурации по умолчанию с помощью команды New-AzContainerGroup:

New-AzContainerGroup `
    -ResourceGroupName myResourceGroup `
    -Name mycontainer1 `
    -Image mcr.microsoft.com/azuredocs/aci-wordcount:latest

Теперь выполните следующую команду New-AzContainerGroup. Она задает переменные среды NumWords и MinLength после заполнения переменной массива envVars:

$envVars = @(
    New-AzContainerInstanceEnvironmentVariableObject -Name "NumWords" -Value "5"
    New-AzContainerInstanceEnvironmentVariableObject -Name "MinLength" -Value "8"
)

$containerGroup = New-AzContainerGroup -ResourceGroupName "myResourceGroup" `
    -Name "mycontainer2" `
    -Image "mcr.microsoft.com/azuredocs/aci-wordcount:latest" `
    -RestartPolicy "OnFailure" `
    -Container @(
        New-AzContainerGroupContainer -Name "mycontainer2" `
            -EnvironmentVariable $envVars
    )

Как только состояние обоих контейнеров станет Terminated (Завершен) (используйте команду Get-AzContainerInstanceLog для проверки состояния), извлеките их журналы с помощью команды Get-AzContainerInstanceLog.

Get-AzContainerInstanceLog -ResourceGroupName myResourceGroup -ContainerGroupName mycontainer1
Get-AzContainerInstanceLog -ResourceGroupName myResourceGroup -ContainerGroupName mycontainer2

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

PS Azure:\> Get-AzContainerInstanceLog -ResourceGroupName myResourceGroup -ContainerGroupName mycontainer1
[('the', 990),
 ('and', 702),
 ('of', 628),
 ('to', 610),
 ('I', 544),
 ('you', 495),
 ('a', 453),
 ('my', 441),
 ('in', 399),
 ('HAMLET', 386)]

Azure:\
PS Azure:\> Get-AzContainerInstanceLog -ResourceGroupName myResourceGroup -ContainerGroupName mycontainer2
[('CLAUDIUS', 120),
 ('POLONIUS', 113),
 ('GERTRUDE', 82),
 ('ROSENCRANTZ', 69),
 ('GUILDENSTERN', 54)]

Azure:\

Пример на портале Azure

Чтобы установить переменные среды при запуске контейнера на портале Azure, укажите их на странице Расширенные параметры при создании контейнера.

  1. На странице Расширенные параметры задайте для параметра Политика перезапуска значение При сбое
  2. В параметре Переменные средывведите NumWords со значением 5 для первой переменной и введите MinLength со значением 8 для второй переменной.
  3. Чтобы проверить и затем развернуть контейнер, выберите Просмотр и создание.

Страница портала, отображающая переменную среды, кнопку

Чтобы просмотреть журналы контейнера, в разделе Параметры выберите Контейнеры, а затем — Журналы. Подобно тому, как это было показано в предыдущих разделах для CLI и PowerShell, вы можете увидеть, как поведение скрипта было изменено после указания переменных среды. Отображаются только пять слов, каждое из которых имеет длину не менее восьми символов.

Выходные данные журналов контейнера на портале

Безопасные значения

Объекты с безопасными значениями предназначены для хранения конфиденциальных данных, например паролей или ключей приложения. Использовать безопасные значения для переменных среды — более безопасный и гибкий способ по сравнению с добавлением значений в образ контейнера. Другой вариант — использовать тома secret, описанные в статье Подключение тома secret в службе "Экземпляры контейнеров Azure".

Переменные среды с безопасными значениями не видны в свойствах контейнера — доступ к их значениям можно получить только из контейнера. Например, свойства контейнера, просматриваемые на портале Azure или с помощью Azure CLI, отображают только имя безопасной переменной, а не ее значение.

Установите безопасную переменную среды, указав для типа переменной свойство secureValue вместо обычного value. В следующем файле YAML представлены две переменные двух разных типов.

Развертывание файла YAML

Создайте файл secure-env.yaml со следующим фрагментом кода.

apiVersion: 2019-12-01
location: eastus
name: securetest
properties:
  containers:
  - name: mycontainer
    properties:
      environmentVariables:
        - name: 'NOTSECRET'
          value: 'my-exposed-value'
        - name: 'SECRET'
          secureValue: 'my-secret-value'
      image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
      ports: []
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
  osType: Linux
  restartPolicy: Always
tags: null
type: Microsoft.ContainerInstance/containerGroups

Выполните следующую команду, чтобы развернуть группу контейнеров с помощью YAML (при необходимости измените имя группы ресурсов):

az container create --resource-group myResourceGroup --file secure-env.yaml

Проверка переменных среды

Запустите команду az container show, чтобы запросить переменные среды контейнера.

az container show --resource-group myResourceGroup --name securetest --query 'containers[].environmentVariables'

Ответ JSON отображает ключ и значение небезопасной переменной среды и только имя безопасной переменной среды:

[
  [
    {
      "name": "NOTSECRET",
      "secureValue": null,
      "value": "my-exposed-value"
    },
    {
      "name": "SECRET",
      "secureValue": null,
      "value": null
    }
  ]
]

С помощью команды az container exec, которая позволяет выполнить команду в запущенном контейнере, вы можете проверить, была ли установлена безопасная переменная среды. Выполните следующую команду, чтобы запустить интерактивный сеанс Bash в контейнере:

az container exec --resource-group myResourceGroup --name securetest --exec-command "/bin/sh"

После открытия интерактивной оболочки в контейнере вы можете получить доступ к значению переменной SECRET:

root@caas-ef3ee231482549629ac8a40c0d3807fd-3881559887-5374l:/# echo $SECRET
my-secret-value

Дальнейшие действия

В скриптах на основе задач, таких как пакетная обработка большого набора данных с несколькими контейнерами, могут использоваться пользовательские переменные среды во время выполнения. Дополнительные сведения о работе контейнеров на основе задач см. в статье Выполнение контейнерных задач в службе "Экземпляры контейнеров Azure".