Поделиться через


Использование и обслуживание общедоступного содержимого с помощью Задач Реестра контейнеров 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

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

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

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

Создайте маркер доступа к имитируемому общедоступному реестру с ограничением по 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 Container Instances

Создайте маркер доступа к реестру, в котором размещен образ 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_CODE1, в результате чего этап задачи 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 для реестра базовых артефактов:

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 для создания автоматизированного рабочего процесса контроля для введения обновленных базовых образов в вашу систему. Ознакомьтесь с дополнительными сведениями об управлении образами в Реестре контейнеров Azure.