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


Использование и обслуживание общедоступного содержимого с помощью Задач Реестра контейнеров Azure

В этой статье приведен пример рабочего процесса в Реестре контейнеров Azure, который помогает управлять использованием и обслуживанием общедоступного содержимого:

  1. Импорт локальных копий зависимых общедоступных образов.
  2. Проверка общедоступных образов с помощью средств проверки безопасности и функционального тестирования.
  3. Перемещение образов в закрытые реестры для внутреннего использования.
  4. Активация обновлений базовых образов для приложений, зависящих от общедоступного содержимого.
  5. Для автоматизации этого рабочего процесса используются Задачи Реестра контейнеров Azure.

На изображении ниже показана сводка рабочего процесса.

Использование рабочего процесса общего содержимого

Рабочий процесс условного импорта помогает управлять зависимостями организации от управляемых внешним образом артефактов — например, образов, источником которых являются общедоступные реестры, включая Docker Hub, GCR, Quay, Реестр контейнеров GitHub, Реестр контейнеров Майкрософт и даже другие реестры контейнеров Azure.

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

Для выполнения задач этих инструкций можно использовать Azure Cloud Shell или локальный экземпляр Azure CLI. Рекомендуется использовать Azure CLI 2.10 или более поздней версии. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

Обзор сценария

элементы рабочего процесса импорта

В этом пошаговом руководстве настраиваются следующие компоненты:

  1. Три реестра контейнеров, представляющие:
    • имитируемый Docker Hub (publicregistry) для поддержки смены базового образа;
    • реестр команды (contoso) для совместного использования частных образов;
    • общий реестр компании или команды (baseartifacts) для импортированного общедоступного содержимого;
  2. задача ACR в каждом реестре. Задачи:
    1. создание имитации общедоступного образа node;
    2. импорт и проверка образа node в общем реестре компании или команды;
    3. создание и развертывание образа hello-world.
  3. Определения задач ACR, включая конфигурации для:
    • коллекция учетных данных реестра, которые являются указателями на хранилище ключей;
    • коллекция секретов в acr-task.yaml, которые являются указателями на хранилище ключей;
    • коллекция настроенных значений, используемых в файле acr-task.yaml;
  4. хранилище ключей Azure для хранения всех секретов;
  5. экземпляр контейнера Azure, в котором размещено приложение сборки hello-world.

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

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

Настройка переменных среды

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

Примеры в этой статье отформатированы для выполнения в оболочке Bash.

# Set the three registry names, must be globally unique:
REGISTRY_PUBLIC=publicregistry
REGISTRY_BASE_ARTIFACTS=contosobaseartifacts
REGISTRY=contoso

# set the location all resources will be created in:
RESOURCE_GROUP_LOCATION=eastus

# default resource groups
REGISTRY_PUBLIC_RG=${REGISTRY_PUBLIC}-rg
REGISTRY_BASE_ARTIFACTS_RG=${REGISTRY_BASE_ARTIFACTS}-rg
REGISTRY_RG=${REGISTRY}-rg

# fully qualified registry urls
REGISTRY_DOCKERHUB_URL=docker.io
REGISTRY_PUBLIC_URL=${REGISTRY_PUBLIC}.azurecr.io
REGISTRY_BASE_ARTIFACTS_URL=${REGISTRY_BASE_ARTIFACTS}.azurecr.io
REGISTRY_URL=${REGISTRY}.azurecr.io

# Azure key vault for storing secrets, name must be globally unique
AKV=acr-task-credentials
AKV_RG=${AKV}-rg

# ACI for hosting the deployed application
ACI=hello-world-aci
ACI_RG=${ACI}-rg

Репозитории и маркеры Git

Для имитации среды создайте вилку для каждого из следующих репозиториев Git, т. е. репозитории, которыми сможете управлять.

Затем измените следующие переменные для этих вилок.

Элемент :main, добавляемый в конец URL-адреса Git, представляет ветвь репозитория по умолчанию.

GIT_BASE_IMAGE_NODE=https://github.com/<your-fork>/base-image-node.git#main
GIT_NODE_IMPORT=https://github.com/<your-fork>/import-baseimage-node.git#main
GIT_HELLO_WORLD=https://github.com/<your-fork>/hello-world.git#main

Для клонирования и установки веб-перехватчиков Git необходим маркер доступа GitHub (PAT) для ACR. Инструкции по созданию маркера с необходимыми разрешениями для частного репозитория см. в статье Создание маркера доступа GitHub.

GIT_TOKEN=<set-git-token-here>

Учетные данные Docker Hub

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

REGISTRY_DOCKERHUB_USER=<yourusername>
REGISTRY_DOCKERHUB_PASSWORD=<yourtoken>

Создание реестров

С помощью команд Azure CLI создайте три реестра контейнеров уровня "Премиум" (каждый в отдельной группе ресурсов):

az group create --name $REGISTRY_PUBLIC_RG --location $RESOURCE_GROUP_LOCATION
az acr create --resource-group $REGISTRY_PUBLIC_RG --name $REGISTRY_PUBLIC --sku Premium

az group create --name $REGISTRY_BASE_ARTIFACTS_RG --location $RESOURCE_GROUP_LOCATION
az acr create --resource-group $REGISTRY_BASE_ARTIFACTS_RG --name $REGISTRY_BASE_ARTIFACTS --sku Premium

az group create --name $REGISTRY_RG --location $RESOURCE_GROUP_LOCATION
az acr create --resource-group $REGISTRY_RG --name $REGISTRY --sku Premium

Создание хранилища ключей и задание секретов

Создайте хранилище ключей:

az group create --name $AKV_RG --location $RESOURCE_GROUP_LOCATION
az keyvault create --resource-group $AKV_RG --name $AKV

Задайте имя пользователя и маркер Docker Hub в хранилище ключей:

az keyvault secret set \
--vault-name $AKV \
--name registry-dockerhub-user \
--value $REGISTRY_DOCKERHUB_USER

az keyvault secret set \
--vault-name $AKV \
--name registry-dockerhub-password \
--value $REGISTRY_DOCKERHUB_PASSWORD

Задайте и проверьте PAT Git в хранилище ключей:

az keyvault secret set --vault-name $AKV --name github-token --value $GIT_TOKEN

az keyvault secret show --vault-name $AKV --name github-token --query value -o tsv

Создание группы ресурсов для экземпляра контейнера Azure

Эта группа ресурсов используется в одной из последующих задач при развертывании образа hello-world.

az group create --name $ACI_RG --location $RESOURCE_GROUP_LOCATION

Создание общедоступного базового образа node

Чтобы имитировать образ node в Docker Hub, создайте задачу ACR для сборки и обслуживания общедоступного образа. Эта конфигурация позволяет имитировать изменения с помощью процессов обслуживания образов node.

az acr task create \
  --name node-public \
  -r $REGISTRY_PUBLIC \
  -f acr-task.yaml \
  --context $GIT_BASE_IMAGE_NODE \
  --git-access-token $(az keyvault secret show \
                        --vault-name $AKV \
                        --name github-token \
                        --query value -o tsv) \
  --set REGISTRY_FROM_URL=${REGISTRY_DOCKERHUB_URL}/ \
  --assign-identity

Чтобы избежать регулирования Docker, добавьте в задачу учетные данные Docker Hub. Для передачи учетных данных Docker в любой реестр, включая Docker Hub, можно использовать команду acr task credentials.

az acr task credential add \
  -n node-public \
  -r $REGISTRY_PUBLIC \
  --login-server $REGISTRY_DOCKERHUB_URL \
  -u https://${AKV}.vault.azure.net/secrets/registry-dockerhub-user \
  -p https://${AKV}.vault.azure.net/secrets/registry-dockerhub-password \
  --use-identity [system]

Предоставьте задаче доступ для чтения значений из хранилища ключей:

az keyvault set-policy \
  --name $AKV \
  --resource-group $AKV_RG \
  --object-id $(az acr task show \
                  --name node-public \
                  --registry $REGISTRY_PUBLIC \
                  --query identity.principalId --output tsv) \
  --secret-permissions get

Задачи можно активировать с помощью операций фиксации Git, обновления базовых образов, таймеров или путем запуска вручную.

Запустите задачу вручную, чтобы создать образ node:

az acr task run -r $REGISTRY_PUBLIC -n node-public

Получите список образов в имитируемом общедоступном реестре:

az acr repository show-tags -n $REGISTRY_PUBLIC --repository node

Создание образа hello-world

Создайте образ hello-world на основе имитации общедоступного образа node.

Создание маркера для доступа на извлечение к имитируемому общедоступному реестру

Создайте маркер доступа к имитируемому общедоступному реестру в области pull. Затем задайте его в хранилище ключей:

az keyvault secret set \
  --vault-name $AKV \
  --name "registry-${REGISTRY_PUBLIC}-user" \
  --value "registry-${REGISTRY_PUBLIC}-user"

az keyvault secret set \
  --vault-name $AKV \
  --name "registry-${REGISTRY_PUBLIC}-password" \
  --value $(az acr token create \
              --name "registry-${REGISTRY_PUBLIC}-user" \
              --registry $REGISTRY_PUBLIC \
              --scope-map _repositories_pull \
              -o tsv \
              --query credentials.passwords[0].value)

Создание маркера для доступа на извлечение для службы "Экземпляры контейнеров Azure"

Создайте маркер доступа к реестру, в котором размещен образ hello-world, с областью действия извлечения. Затем задайте его в хранилище ключей:

az keyvault secret set \
  --vault-name $AKV \
  --name "registry-${REGISTRY}-user" \
  --value "registry-${REGISTRY}-user"

az keyvault secret set \
  --vault-name $AKV \
  --name "registry-${REGISTRY}-password" \
  --value $(az acr token create \
              --name "registry-${REGISTRY}-user" \
              --registry $REGISTRY \
              --repository hello-world content/read \
              -o tsv \
              --query credentials.passwords[0].value)

Создание задачи для сборки и обслуживания образа hello-world

Следующая команда создает задачу из определения в acr-tasks.yaml в репозитории hello-world. Отдельные этапы задачи создают образ hello-world, а затем развертывают его в службе "Экземпляры контейнеров Azure". Группа ресурсов для службы "Экземпляры контейнеров Azure" была создана в предыдущем разделе. Посредством вызова az container create в задаче с единственным отличием в image:tag в этом пошаговом руководстве задача развертывается в одном экземпляре.

az acr task create \
  -n hello-world \
  -r $REGISTRY \
  -f acr-task.yaml \
  --context $GIT_HELLO_WORLD \
  --git-access-token $(az keyvault secret show \
                        --vault-name $AKV \
                        --name github-token \
                        --query value -o tsv) \
  --set REGISTRY_FROM_URL=${REGISTRY_PUBLIC_URL}/ \
  --set KEYVAULT=$AKV \
  --set ACI=$ACI \
  --set ACI_RG=$ACI_RG \
  --assign-identity

Добавьте учетные данные в задачу для имитируемого общедоступного реестра:

az acr task credential add \
  -n hello-world \
  -r $REGISTRY \
  --login-server $REGISTRY_PUBLIC_URL \
  -u https://${AKV}.vault.azure.net/secrets/registry-${REGISTRY_PUBLIC}-user \
  -p https://${AKV}.vault.azure.net/secrets/registry-${REGISTRY_PUBLIC}-password \
  --use-identity [system]

Предоставьте задаче доступ для чтения значений из хранилища ключей:

az keyvault set-policy \
  --name $AKV \
  --resource-group $AKV_RG \
  --object-id $(az acr task show \
                  --name hello-world \
                  --registry $REGISTRY \
                  --query identity.principalId --output tsv) \
  --secret-permissions get

Предоставьте задаче доступ для создания экземпляров контейнеров Azure и управления ими, предоставив ей доступ к группе ресурсов:

az role assignment create \
  --assignee $(az acr task show \
  --name hello-world \
  --registry $REGISTRY \
  --query identity.principalId --output tsv) \
  --scope $(az group show -n $ACI_RG --query id -o tsv) \
  --role owner

После создания и настройки задачи запустите задачу для сборки и развертывания образа hello-world.

az acr task run -r $REGISTRY -n hello-world

После создания получите IP-адрес контейнера, в котором размещен образ hello-world.

az container show \
  --resource-group $ACI_RG \
  --name ${ACI} \
  --query ipAddress.ip \
  --out tsv

В браузере перейдите по IP-адресу, чтобы увидеть запущенное приложение.

Обновление базового образа "сомнительным" изменением

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

  1. Откройте Dockerfile в вилке репозитория base-image-node.
  2. Измените BACKGROUND_COLOR на Orange, чтобы имитировать изменение.
ARG REGISTRY_NAME=
FROM ${REGISTRY_NAME}node:15-alpine
ENV NODE_VERSION 15-alpine
ENV BACKGROUND_COLOR Orange

Зафиксируйте изменение и пронаблюдайте за тем, как задачи ACR автоматически начнут сборку.

Проследите за тем, как начнется выполнение задачи:

watch -n1 az acr task list-runs -r $REGISTRY_PUBLIC -o table

Со временем вы должны увидеть состояние Succeeded для триггера Commit:

RUN ID    TASK      PLATFORM    STATUS     TRIGGER    STARTED               DURATION
--------  --------  ----------  ---------  ---------  --------------------  ----------
ca4       hub-node  linux       Succeeded  Commit     2020-10-24T05:02:29Z  00:00:22

Нажмите CTRL + C, чтобы прервать выполнение команды watch, а затем просмотрите журналы последнего запуска:

az acr task logs -r $REGISTRY_PUBLIC

После создания образа node команда watch для задач ACR автоматически приступит к сборке образа hello-world:

watch -n1 az acr task list-runs -r $REGISTRY -o table

Со временем вы должны увидеть состояние Succeeded для триггера Image Update:

RUN ID    TASK         PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  -----------  ----------  ---------  ------------  --------------------  ----------
dau       hello-world  linux       Succeeded  Image Update  2020-10-24T05:08:45Z  00:00:31

Нажмите CTRL + C, чтобы прервать выполнение команды watch, а затем просмотрите журналы последнего запуска:

az acr task logs -r $REGISTRY

После завершения получите IP-адрес сайта, на котором размещен обновленный образ hello-world:

az container show \
  --resource-group $ACI_RG \
  --name ${ACI} \
  --query ipAddress.ip \
  --out tsv

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

Запись после изменения

На этом этапе у вас есть образ hello-world, который был автоматически создан на основе операций фиксации Git и изменений в базовом образе node. В этом примере задача выполняет сборку на основе базового образа в Реестре контейнеров Azure, но можно использовать любой поддерживаемый реестр.

Обновление базового образа автоматически вызывает запуск задачи при обновлении образа node. Как мы видим, нужны не все обновления.

Условный импорт общедоступного содержимого

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

В этом разделе вы создадите задачу ACR для выполнения следующих действий:

  • Сборка тестового образа
  • Запуск скрипта функционального теста ./test.sh для тестового образа
  • В случае успешной проверки образа — импорт общедоступного образа в реестр baseimages

Добавление тестирования автоматизации

Для условного импорта содержимого вышестоящих процессов реализуется автоматическое тестирование. В этом примере скрипт test.sh проверяет $BACKGROUND_COLOR. Если тест завершается ошибкой, возвращается EXIT_CODE 1, в результате чего этап задачи ACR также завершается ошибкой, тем самым завершая выполнение задачи. Тесты могут охватывать инструменты любых видов, включая записи в журналах. Результат проверки зависит от ответа "успех/сбой" скрипта, который воспроизведен здесь следующим образом:

if [ ""$(echo $BACKGROUND_COLOR | tr '[:lower:]' '[:upper:]') = 'RED' ]; then
    echo -e "\e[31mERROR: Invalid Color:\e[0m" ${BACKGROUND_COLOR}
    EXIT_CODE=1
else
  echo -e "\e[32mValidation Complete - No Known Errors\e[0m"
fi
exit ${EXIT_CODE}

YAML-код задачи

Проверьте файл acr-task.yaml в репозитории import-baseimage-node, который выполняет следующие действия:

  1. Создайте тестовый базовый образ с помощью следующего файла Dockerfile:
    ARG REGISTRY_FROM_URL=
    FROM ${REGISTRY_FROM_URL}node:15-alpine
    WORKDIR /test
    COPY ./test.sh .
    CMD ./test.sh
    
  2. По завершении проверяет образ, запустив контейнер, в котором выполняется ./test.sh.
  3. В случае успешного завершения выполняет этапы импорта с условием when: ['validate-base-image'].
version: v1.1.0
steps:
  - id: build-test-base-image
    # Build off the base image we'll track
    # Add a test script to do unit test validations
    # Note: the test validation image isn't saved to the registry
    # but the task logs captures log validation results
    build: >
      --build-arg REGISTRY_FROM_URL={{.Values.REGISTRY_FROM_URL}}
      -f ./Dockerfile
      -t {{.Run.Registry}}/node-import:test
      .
  - id: validate-base-image
    # only continues if node-import:test returns a non-zero code
    when: ['build-test-base-image']
    cmd: "{{.Run.Registry}}/node-import:test"
  - id: pull-base-image
    # import the public image to base-artifacts
    # Override the stable tag,
    # and create a unique tag to enable rollback
    # to a previously working image
    when: ['validate-base-image']
    cmd: >
        docker pull {{.Values.REGISTRY_FROM_URL}}node:15-alpine
  - id: retag-base-image
    when: ['pull-base-image']
    cmd: docker tag {{.Values.REGISTRY_FROM_URL}}node:15-alpine {{.Run.Registry}}/node:15-alpine
  - id: retag-base-image-unique-tag
    when: ['pull-base-image']
    cmd: docker tag {{.Values.REGISTRY_FROM_URL}}node:15-alpine {{.Run.Registry}}/node:15-alpine-{{.Run.ID}}
  - id: push-base-image
    when: ['retag-base-image', 'retag-base-image-unique-tag']
    push:
    - "{{.Run.Registry}}/node:15-alpine"
    - "{{.Run.Registry}}/node:15-alpine-{{.Run.ID}}"

Создание задачи для импорта и тестирования базового образа

  az acr task create \
  --name base-import-node \
  -f acr-task.yaml \
  -r $REGISTRY_BASE_ARTIFACTS \
  --context $GIT_NODE_IMPORT \
  --git-access-token $(az keyvault secret show \
                        --vault-name $AKV \
                        --name github-token \
                        --query value -o tsv) \
  --set REGISTRY_FROM_URL=${REGISTRY_PUBLIC_URL}/ \
  --assign-identity

Добавьте учетные данные в задачу для имитируемого общедоступного реестра:

az acr task credential add \
  -n base-import-node \
  -r $REGISTRY_BASE_ARTIFACTS \
  --login-server $REGISTRY_PUBLIC_URL \
  -u https://${AKV}.vault.azure.net/secrets/registry-${REGISTRY_PUBLIC}-user \
  -p https://${AKV}.vault.azure.net/secrets/registry-${REGISTRY_PUBLIC}-password \
  --use-identity [system]

Предоставьте задаче доступ для чтения значений из хранилища ключей:

az keyvault set-policy \
  --name $AKV \
  --resource-group $AKV_RG \
  --object-id $(az acr task show \
                  --name base-import-node \
                  --registry $REGISTRY_BASE_ARTIFACTS \
                  --query identity.principalId --output tsv) \
  --secret-permissions get

Запуск задачи импорта:

az acr task run -n base-import-node -r $REGISTRY_BASE_ARTIFACTS

Примечание.

Если задача завершается с ошибкой ./test.sh: Permission denied, убедитесь, что у скрипта есть разрешения на выполнение, и выполните фиксацию в репозитории Git:

chmod +x ./test.sh

Обновление образа hello-world для сборки на основе условного образа node

Создайте маркер доступа для доступа к реестру base-artifacts с областью read из репозитория node. Затем задайте его в хранилище ключей:

az keyvault secret set \
  --vault-name $AKV \
  --name "registry-${REGISTRY_BASE_ARTIFACTS}-user" \
  --value "registry-${REGISTRY_BASE_ARTIFACTS}-user"

az keyvault secret set \
  --vault-name $AKV \
  --name "registry-${REGISTRY_BASE_ARTIFACTS}-password" \
  --value $(az acr token create \
              --name "registry-${REGISTRY_BASE_ARTIFACTS}-user" \
              --registry $REGISTRY_BASE_ARTIFACTS \
              --repository node content/read \
              -o tsv \
              --query credentials.passwords[0].value)

Добавьте учетные данные в задачу hello-world для реестра base-artifacts:

az acr task credential add \
  -n hello-world \
  -r $REGISTRY \
  --login-server $REGISTRY_BASE_ARTIFACTS_URL \
  -u https://${AKV}.vault.azure.net/secrets/registry-${REGISTRY_BASE_ARTIFACTS}-user \
  -p https://${AKV}.vault.azure.net/secrets/registry-${REGISTRY_BASE_ARTIFACTS}-password \
  --use-identity [system]

Обновите задачу, изменив REGISTRY_FROM_URL на адрес реестра BASE_ARTIFACTS.

az acr task update \
  -n hello-world \
  -r $REGISTRY \
  --set KEYVAULT=$AKV \
  --set REGISTRY_FROM_URL=${REGISTRY_BASE_ARTIFACTS_URL}/ \
  --set ACI=$ACI \
  --set ACI_RG=$ACI_RG

Запустите задачу hello-world, чтобы изменить ее зависимость базового образа:

az acr task run -r $REGISTRY -n hello-world

Обновление базового образа "допустимым" изменением

  1. Откройте Dockerfile в репозитории base-image-node.
  2. Измените BACKGROUND_COLOR на Green, чтобы имитировать допустимое изменение.
ARG REGISTRY_NAME=
FROM ${REGISTRY_NAME}node:15-alpine
ENV NODE_VERSION 15-alpine
ENV BACKGROUND_COLOR Green

Зафиксируйте изменения и наблюдайте за последовательностью обновлений:

watch -n1 az acr task list-runs -r $REGISTRY_PUBLIC -o table

После запуска нажмите CTRL + C и просмотрите журналы:

az acr task logs -r $REGISTRY_PUBLIC

По завершении понаблюдайте за задачей base-image-import:

watch -n1 az acr task list-runs -r $REGISTRY_BASE_ARTIFACTS -o table

После запуска нажмите CTRL + C и просмотрите журналы:

az acr task logs -r $REGISTRY_BASE_ARTIFACTS

По завершении понаблюдайте за задачей hello-world:

watch -n1 az acr task list-runs -r $REGISTRY -o table

После запуска нажмите CTRL + C и просмотрите журналы:

az acr task logs -r $REGISTRY

После завершения получите IP-адрес сайта, на котором размещен обновленный образ hello-world:

az container show \
  --resource-group $ACI_RG \
  --name ${ACI} \
  --query ipAddress.ip \
  --out tsv

В браузере перейдите на сайт, у которого должен быть зеленый фон, сигнализирующий о допустимом изменении.

Просмотр условного рабочего процесса

Снова выполните действия, описанные в предыдущем разделе, с красным цветом фона.

  1. Откройте Dockerfile в репозитории base-image-node.
  2. Измените BACKGROUND_COLOR на Red, чтобы имитировать недопустимое изменение.
ARG REGISTRY_NAME=
FROM ${REGISTRY_NAME}node:15-alpine
ENV NODE_VERSION 15-alpine
ENV BACKGROUND_COLOR Red

Зафиксируйте изменения и наблюдайте за последовательностью обновлений:

watch -n1 az acr task list-runs -r $REGISTRY_PUBLIC -o table

После запуска нажмите CTRL + C и просмотрите журналы:

az acr task logs -r $REGISTRY_PUBLIC

По завершении понаблюдайте за задачей base-image-import:

watch -n1 az acr task list-runs -r $REGISTRY_BASE_ARTIFACTS -o table

После запуска нажмите CTRL + C и просмотрите журналы:

az acr task logs -r $REGISTRY_BASE_ARTIFACTS

На этом этапе вы должны увидеть, что задача base-import-node не проходит проверку и останавливает последовательность публикации обновления hello-world. Она выводит выходные данные следующего вида:

[...]
2020/10/30 03:57:39 Launching container with name: validate-base-image
Validating Image
NODE_VERSION: 15-alpine
BACKGROUND_COLOR: Red
ERROR: Invalid Color: Red
2020/10/30 03:57:40 Container failed during run: validate-base-image. No retries remaining.
failed to run step ID: validate-base-image: exit status 1

Публикация обновления в hello-world

Изменения в образе hello-world будут продолжать использовать последний проверенный образ node.

Любые дополнительные изменения в базовом образе node, которые проходят условные проверки, будут активировать обновления базового образа для образа hello-world.

Очистка

Удалите ресурсы, созданные в рамках этой статьи, если они вам больше не нужны.

az group delete -n $REGISTRY_RG --no-wait -y
az group delete -n $REGISTRY_PUBLIC_RG --no-wait -y
az group delete -n $REGISTRY_BASE_ARTIFACTS_RG --no-wait -y
az group delete -n $AKV_RG --no-wait -y
az group delete -n $ACI_RG --no-wait -y

Следующие шаги

В этой статье вы использовали задачи ACR для создания автоматизированного рабочего процесса gating, чтобы представить обновленные базовые образы в вашей среде. Ознакомьтесь с дополнительными сведениями об управлении образами в Реестре контейнеров Azure.