Бөлісу құралы:


Настройка образа контейнера для выполнения развертываний с помощью ARM и Bicep

Из этой статьи вы узнаете, как создавать пользовательские образы контейнеров Azure Resource Manager (ARM) и Bicep для развертывания определений среды в средах развертывания Azure (ADE).

Определение среды состоит по крайней мере из двух файлов: файла шаблона, например azuredeploy.json или main.bicep, и файла манифеста с именем environment.yaml. ADE использует контейнеры для развертывания определений среды и изначально поддерживает платформы ARM и Bicep IaC.

Модель расширяемости ADE позволяет создавать пользовательские образы контейнеров для использования с определениями среды. Используя модель расширяемости, вы можете создавать собственные пользовательские образы контейнеров и хранить их в реестре контейнеров, например DockerHub. Затем вы можете ссылаться на эти образы в определениях среды для развертывания сред.

Команда ADE предоставляет набор образов для начала работы, включая основной образ и образ Azure Resource Manager (ARM)/Bicep. Эти образы можно получить в папке Runner-Images .

Необходимые компоненты

Использование образов контейнеров с ADE

Вы можете использовать один из следующих подходов к использованию образов контейнеров с ADE:

  • Используйте стандартный образ контейнера: для простых сценариев используйте стандартный образ контейнера Bicep, предоставляемый ADE.
  • Создайте пользовательский образ контейнера: для более сложных сценариев создайте пользовательский образ контейнера, соответствующий вашим конкретным требованиям.

Независимо от выбранного подхода необходимо указать образ контейнера в определении среды для развертывания ресурсов Azure.

Использование стандартного образа контейнера Bicep

ADE поддерживает Bicep в собственном коде, поэтому вы можете настроить определение среды, которое развертывает ресурсы Azure для среды развертывания, добавив файлы шаблонов (azuredeploy.json и environment.yaml) в каталог. Затем ADE использует стандартный образ контейнера Bicep для создания среды развертывания.

В файле environment.yaml свойство runner указывает расположение образа контейнера, который требуется использовать. Чтобы использовать образ, опубликованный на Реестр артефактов Microsoft, используйте соответствующий модуль выполнения идентификаторов, как указано в следующей таблице.

В следующем примере показан модуль выполнения, ссылающийся на образ контейнера Bicep:

    name: WebApp
    version: 1.0.0
    summary: Azure Web App Environment
    description: Deploys a web app in Azure without a datastore
    runner: Bicep
    templatePath: azuredeploy.json

Стандартный образ контейнера Bicep можно увидеть в примере репозитория ADE в папке Runner-Images для образа ARM-Bicep .

Дополнительные сведения о создании определений среды, использующих образы контейнеров ADE для развертывания ресурсов Azure, см. в статье "Добавление и настройка определения среды".

Создание пользовательского образа контейнера Bicep

Создание пользовательского образа контейнера позволяет настроить развертывания в соответствии с вашими требованиями. Пользовательские образы можно создавать на основе стандартных образов контейнеров ADE.

После завершения настройки образа необходимо создать образ и отправить его в реестр контейнеров.

Создание и настройка образа контейнера с помощью Docker

В этом примере вы узнаете, как создать образ Docker для использования развертываний ADE и доступа к интерфейсу командной строки ADE, базируя образ из одного из созданных образов ADE.

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

Чтобы создать образ, настроенный для ADE, выполните следующие действия.

  1. Создайте образ на созданном ADE образе или на выбранном изображении с помощью инструкции FROM.
  2. Установите все необходимые пакеты для образа с помощью инструкции RUN.
  3. Создайте папку скриптов на том же уровне, что и Dockerfile, сохраните deploy.sh и delete.sh файлы в нем и убедитесь, что эти скрипты доступны для обнаружения и исполняемого файла в созданном контейнере. Этот шаг необходим для развертывания с помощью основного образа ADE.

Выбор примера образа контейнера с помощью инструкции FROM

Добавьте инструкцию FROM в созданный Файл DockerFile для нового образа, указывающего на образ, размещенный на Реестр артефактов Microsoft.

Ниже приведен пример инструкции FROM, ссылающейся на образ ядра примера:

FROM mcr.microsoft.com/deployment-environments/runners/core:latest

Эта инструкция извлекает последний опубликованный основной образ и делает его основой для пользовательского образа.

Установка Bicep в Dockerfile

Пакет Bicep можно установить с помощью Azure CLI с помощью инструкции RUN, как показано в следующем примере:

RUN az bicep install

Образы ADE основаны на образе Azure CLI и предварительно установлены пакеты ADE CLI и JQ. Дополнительные сведения о Azure CLI и пакете JQ можно узнать больше.

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

Выполнение скриптов оболочки операций

В примерах образов операции определяются и выполняются на основе имени операции. В настоящее время поддерживаются два имена операций развертывания и удаления.

Чтобы настроить пользовательский образ для использования этой структуры, укажите папку на уровне именованных скриптов Dockerfile и укажите два файла, deploy.sh и delete.sh. Скрипт оболочки развертывания запускается при создании или повторном развертывании среды, а сценарий оболочки удаления запускается при удалении среды. Примеры скриптов оболочки можно просмотреть в репозитории в папке Runner-Images для образа ARM-Bicep .

Чтобы убедиться, что эти скрипты оболочки являются исполняемыми, добавьте в Dockerfile следующие строки:

COPY scripts/* /scripts/
RUN find /scripts/ -type f -iname "*.sh" -exec dos2unix '{}' '+'
RUN find /scripts/ -type f -iname "*.sh" -exec chmod +x {} \;

Создание скриптов оболочки операций для развертывания шаблонов ARM или Bicep

Чтобы обеспечить успешное развертывание инфраструктуры ARM или Bicep через ADE, необходимо:

  • Преобразование параметров ADE в допустимые для ARM параметры
  • Разрешить связанные шаблоны, если они используются в развертывании
  • Использование привилегированного управляемого удостоверения для выполнения развертывания

Во время точки входа основного образа все параметры, заданные для текущей среды, хранятся в переменной $ADE_OPERATION_PARAMETERS. Чтобы преобразовать их в допустимые параметры ARM, можно выполнить следующую команду с помощью JQ:

# format the parameters as arm parameters
deploymentParameters=$(echo "$ADE_OPERATION_PARAMETERS" | jq --compact-output '{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": (to_entries | if length == 0 then {} else (map( { (.key): { "value": .value } } ) | add) end) }' )

Затем, чтобы устранить все связанные шаблоны, используемые в шаблоне на основе JSON ARM, можно декомпилировать основной файл шаблона, который разрешает все файлы локальной инфраструктуры, используемые во многих модулях Bicep. Затем перестройте эти модули обратно в один шаблон ARM с связанными шаблонами, внедренными в основной шаблон ARM в виде вложенных шаблонов. Этот шаг необходим только во время операции развертывания. Основной файл шаблона можно указать с помощью $ADE_TEMPLATE_FILE набора во время точки входа основного образа, и эту переменную следует сбросить с помощью файла шаблона повторной компиляции. См. следующий пример.

if [[ $ADE_TEMPLATE_FILE == *.json ]]; then

    hasRelativePath=$( cat $ADE_TEMPLATE_FILE | jq '[.. | objects | select(has("templateLink") and (.templateLink | has("relativePath")))] | any' )

    if [ "$hasRelativePath" = "true" ]; then
        echo "Resolving linked ARM templates"

        bicepTemplate="${ADE_TEMPLATE_FILE/.json/.bicep}"
        generatedTemplate="${ADE_TEMPLATE_FILE/.json/.generated.json}"

        az bicep decompile --file "$ADE_TEMPLATE_FILE"
        az bicep build --file "$bicepTemplate" --outfile "$generatedTemplate"

        # Correctly reassign ADE_TEMPLATE_FILE without the $ prefix during assignment
        ADE_TEMPLATE_FILE="$generatedTemplate"
    fi
fi

Чтобы предоставить разрешения для развертывания, необходимо выполнить развертывание и удаление ресурсов в подписке, используйте привилегированное управляемое удостоверение, связанное с типом среды проекта ADE. Если для развертывания требуются специальные разрешения, например определенные роли, назначьте эти роли удостоверениям среды проекта. Иногда управляемое удостоверение не сразу доступно при вводе контейнера; Повторите попытку до успешного входа.

echo "Signing into Azure using MSI"
while true; do
    # managed identity isn't available immediately
    # we need to do retry after a short nap
    az login --identity --allow-no-subscriptions --only-show-errors --output none && {
        echo "Successfully signed into Azure"
        break
    } || sleep 5
done

Чтобы начать развертывание шаблонов ARM или Bicep, выполните az deployment group create команду. При выполнении этой команды в контейнере выберите имя развертывания, которое не переопределяет предыдущие развертывания, и используйте --no-prompt true--only-show-errors флаги и убедитесь, что развертывание не завершится сбоем или сбоем при ожидании ввода данных пользователем, как показано в следующем примере:

deploymentName=$(date +"%Y-%m-%d-%H%M%S")
az deployment group create --subscription $ADE_SUBSCRIPTION_ID \
    --resource-group "$ADE_RESOURCE_GROUP_NAME" \
    --name "$deploymentName" \
    --no-prompt true --no-wait \
    --template-file "$ADE_TEMPLATE_FILE" \
    --parameters "$deploymentParameters" \
    --only-show-errors

Чтобы удалить среду, выполните развертывание в полном режиме и укажите пустой шаблон ARM, который удаляет все ресурсы в указанной группе ресурсов ADE, как показано в следующем примере:

deploymentName=$(date +"%Y-%m-%d-%H%M%S")
az deployment group create --resource-group "$ADE_RESOURCE_GROUP_NAME" \
    --name "$deploymentName" \
    --no-prompt true --no-wait --mode Complete \
    --only-show-errors \
    --template-file "$DIR/empty.json"

Вы можете проверить состояние подготовки и сведения, выполнив приведенные ниже команды. ADE использует некоторые специальные функции для чтения и предоставления дополнительных контекстов на основе сведений о подготовке, которые можно найти в папке Runner-Images . Простая реализация может быть следующей:

if [ $? -eq 0 ]; then # deployment successfully created
    while true; do

        sleep 1

        ProvisioningState=$(az deployment group show --resource-group "$ADE_RESOURCE_GROUP_NAME" --name "$deploymentName" --query "properties.provisioningState" -o tsv)
        ProvisioningDetails=$(az deployment operation group list --resource-group "$ADE_RESOURCE_GROUP_NAME" --name "$deploymentName")

        echo "$ProvisioningDetails"

        if [[ "CANCELED|FAILED|SUCCEEDED" == *"${ProvisioningState^^}"* ]]; then

            echo -e "\nDeployment $deploymentName: $ProvisioningState"

            if [[ "CANCELED|FAILED" == *"${ProvisioningState^^}"* ]]; then
                exit 11
            else
                break
            fi
        fi
    done
fi

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

deploymentOutput=$(az deployment group show -g "$ADE_RESOURCE_GROUP_NAME" -n "$deploymentName" --query properties.outputs)
if [ -z "$deploymentOutput" ]; then
    deploymentOutput="{}"
fi
echo "{\"outputs\": $deploymentOutput}" > $ADE_OUTPUTS

Сделать настраиваемый образ доступным для ADE

Необходимо создать образ Docker и отправить его в реестр контейнеров, чтобы сделать его доступным для использования в ADE. Вы можете создать образ с помощью интерфейса командной строки Docker или с помощью скрипта, предоставленного ADE.

Выберите соответствующую вкладку, чтобы узнать больше о каждом подходе.

Прежде чем отправлять образ в реестр, убедитесь , что на компьютере установлен модуль Docker. Затем перейдите в каталог Dockerfile и выполните следующую команду:

docker build . -t {YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}

Например, если вы хотите сохранить образ в репозитории в реестре с именем customImageи отправить с помощью версии тега 1.0.0, выполните следующие действия:

docker build . -t {YOUR_REGISTRY}.azurecr.io/customImage:1.0.0

Отправка образа Docker в реестр

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

Реестр контейнеров Azure — это предложение Azure, которое хранит образы контейнеров и аналогичные артефакты.

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

Чтобы настроить реестр для включения анонимного извлечения образа, выполните следующие команды в Azure CLI:

az login
az acr login -n {YOUR_REGISTRY}
az acr update -n {YOUR_REGISTRY} --public-network-enabled true
az acr update -n {YOUR_REGISTRY} --anonymous-pull-enabled true

Когда вы будете готовы отправить образ в реестр, выполните следующую команду:

docker push {YOUR_REGISTRY}.azurecr.io/{YOUR_IMAGE_LOCATION}:{YOUR_TAG}

Подключение образа к определению среды

При создании определений среды для использования пользовательского образа в развертывании измените runner свойство в файле манифеста (environment.yaml или manifest.yaml).

runner: "{YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}"

Дополнительные сведения о создании определений среды, использующих образы контейнеров ADE для развертывания ресурсов Azure, см. в статье "Добавление и настройка определения среды".

Доступ к журналам операций и сведениям об ошибках

ADE сохраняет сведения об ошибке для неудачного развертывания в файле $ADE_ERROR_LOG в контейнере.

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

  1. Войдите на портал разработчика.

  2. Определите среду, которая не удалось развернуть, и выберите "Просмотреть сведения".

    Снимок экрана: сведения об ошибке развертывания с ошибкой, в частности недопустимое имя учетной записи хранения.

  3. Просмотрите сведения об ошибке в разделе сведений об ошибке.

    Снимок экрана: сбой развертывания среды с кнопкой

Кроме того, azure CLI можно использовать для просмотра сведений об ошибке среды с помощью следующей команды:

az devcenter dev environment show --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}

Чтобы просмотреть журналы операций для развертывания или удаления среды, используйте Azure CLI для получения последней операции для вашей среды, а затем просмотрите журналы для этого идентификатора операции.

# Get list of operations on the environment, choose the latest operation
az devcenter dev environment list-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}
# Using the latest operation ID, view the operation logs
az devcenter dev environment show-logs-by-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME} --operation-id {LATEST_OPERATION_ID}