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


Руководство. Автоматизация сборок образов контейнера при обновлении базового образа в другом частном реестре контейнеров

Задачи ACR поддерживают автоматизированные сборки образов при обновлении базового образа контейнера, например при исправлении ОС или платформы приложений в одном из базовых образов.

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

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

  • Создание базового образа в базовом реестре
  • Создание задачи сборки приложения в другом реестре для отслеживания базового образа
  • обновление базового образа для запуска задачи образа приложения;
  • отображение активированной задачи;
  • проверка обновленного образа приложения.

Предпосылки

Завершение работы с предыдущими руководствами

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

  • Создание реестра контейнеров Azure
  • Форкнуть образец репозитория
  • Клонируйте репозиторий с примером.
  • Создали личный маркер доступа GitHub.

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

Создание образов контейнеров в облаке с помощью задач Azure Container Registry

Автоматизация сборок образов контейнеров с помощью задач Azure Container Registry

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

Настройка среды

Заполните эти переменные среды оболочки значениями, подходящими для вашей среды. Этот шаг не является обязательным, но он упрощает выполнение многолинейных команд Azure CLI в этом руководстве. Если вы не заполните эти переменные среды, вам придется вручную заменять каждое значение в примерах команд.

BASE_ACR=<base-registry-name>   # The name of your Azure container registry for base images
ACR_NAME=<registry-name>        # The name of your Azure container registry for application images
GIT_USER=<github-username>      # Your GitHub user account name
GIT_PAT=<personal-access-token> # The PAT you generated in the second tutorial

Сценарий обновления базового образа

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

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

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

  • Dockerfile-app: небольшое Node.js веб-приложение, которое отображает статическую веб-страницу с версией Node.js, на которой оно работает. Строка версии моделируется: она отображает содержимое переменной среды (NODE_VERSION), которая определена в базовом образе.

  • Dockerfile-base: образ, который приложение Dockerfile-app определяет как свою базу. Сам он основан на образе узла и включает переменную среды NODE_VERSION.

В следующих разделах вы создадите задачу, обновите значение NODE_VERSION в Dockerfile базового образа, а затем используете ACR Tasks для создания базового образа. Когда задача ACR принудительно отправит новый базовый образ в реестр, он автоматически запустит сборку образа приложения. При желании можно запустить образ контейнера приложения локально, чтобы увидеть различные строки версии в созданных образах.

В этом руководстве задача ACR создает и отправляет образ контейнера приложения, указанный в Dockerfile. С помощью решения "Задачи ACR" можно также запускать многошаговые задачи, используя файл YAML для определения действий по созданию, отправке и тестированию (при необходимости) нескольких контейнеров.

создание базового образа;

Для начала создайте базовый образ с помощью функции быстрой задачи в решении "Задачи ACR", выполнив команду az acr build. Как обсуждалось в первом руководстве этой серии, этот процесс позволит не только создать образ, но и отправить его в реестр контейнеров (при успешном выполнении сборки). В этом примере образ отправляется в реестр базовых образов.

az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .

Создайте задачу для отслеживания частного базового образа

Затем создайте задачу в реестре образов приложения, включив управляемое удостоверение, используя команду az acr task create. Управляемое удостоверение используется в последующих шагах, чтобы задача выполняла проверку подлинности в реестре базовых образов.

В этом примере используется назначаемое системой удостоверение, но вы можете создать и включить управляемое удостоверение, назначаемое пользователем, для определенных сценариев. Подробнее см. в статье о межреестровой аутентификации в задаче ACR с использованием управляемой Azure идентичности.

az acr task create \
    --registry $ACR_NAME \
    --name baseexample2 \
    --image helloworld:{{.Run.ID}} \
    --context https://github.com/$GIT_USER/acr-build-helloworld-node.git#main \
    --file Dockerfile-app \
    --git-access-token $GIT_PAT \
    --arg REGISTRY_NAME=$BASE_ACR.azurecr.io \
    --assign-identity

Эта задача аналогична той, которую вы создали при работе с предыдущим учебником. Она инструктирует задачи ACR активировать сборку образа, когда коммиты передаются в репозиторий, указанный с помощью --context. Хотя Dockerfile, используемый для создания образа в предыдущем руководстве, указывает общедоступный базовый образ (FROM node:15-alpine), Dockerfile в этой задаче Dockerfile-app указывает базовый образ в реестре базовых образов:

FROM ${REGISTRY_NAME}/baseimages/node:15-alpine

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

Предоставление разрешений на запрос идентификационных данных основному реестру

Чтобы предоставить управляемому удостоверению задачи разрешения на извлечение образов из реестра исходных образов, сначала запустите az acr task show, чтобы получить идентификатор удостоверения сервисного субъекта. Затем выполните команду az acr show , чтобы получить идентификатор ресурса базового реестра:

# Get service principal ID of the task
principalID=$(az acr task show --name baseexample2 --registry $ACR_NAME --query identity.principalId --output tsv) 

# Get resource ID of the base registry
baseregID=$(az acr show --name $BASE_ACR --query id --output tsv) 

Назначьте разрешения на извлечение управляемого удостоверения реестру, выполнив команду az role assignment create. Правильная роль, используемая в назначении ролей, зависит от того, включен ли реестр ABAC или нет.

ROLE="Container Registry Repository Reader" # For ABAC-enabled registries. For non-ABAC registries, use AcrPull.
az role assignment create \
  --assignee $principalID \
  --scope $baseregID --role "$ROLE" 

Добавьте учетные данные целевого реестра в задачу

Запустите az acr task credential add, чтобы добавить учетные данные в задачу. --use-identity [system] Передайте параметр, чтобы указать, что назначаемое системой управляемое удостоверение задачи может получить доступ к учетным данным.

az acr task credential add \
  --name baseexample2 \
  --registry $ACR_NAME \
  --login-server $BASE_ACR.azurecr.io \
  --use-identity [system] 

Выполнение задачи вручную

Используйте команду az acr task run, чтобы вручную запустить задачу и создать образ приложения. Этот шаг нужно выполнить для того, чтобы задача отслеживала зависимость образа приложения от базового образа.

az acr task run --registry $ACR_NAME --name baseexample2

По завершении задачи запишите ИД запуска (например, "da6"), если вы хотите выполнить следующий необязательный шаг.

Необязательно. Локальный запуск контейнера приложения

Если вы работаете локально (а не в облачной среде Cloud Shell) и у вас установлен Docker, запустите контейнер, чтобы увидеть приложение, отображаемое в веб-браузере, а затем восстановите его базовый образ. Если вы используете Cloud Shell, пропустите этот раздел (Cloud Shell не поддерживает az acr login или docker run).

Сначала выполните проверку подлинности реестра контейнеров с помощью команды az acr login:

az acr login --name $ACR_NAME

Затем локально запустите контейнер с помощью docker run. Замените код <run-id> на ИД запуска, полученный в выходных данных на предыдущем шаге (например, "da6"). В этом примере задается имя контейнера myapp и включен параметр --rm для удаления контейнера при его остановке.

docker run -d -p 8080:80 --name myapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>

Перейдите по адресу http://localhost:8080 в вашем браузере, и вы увидите номер версии Node.js, отображаемый на веб-странице, похожим на приведенный ниже. На более позднем этапе вы увеличиваете версию, добавив "a" в строку версии.

Снимок экрана: пример приложения в браузере

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

docker stop myapp

Список сборок

Далее перечислите запуски заданий, которые Задачи ACR выполнили для реестра, с помощью команды az acr task list-runs:

az acr task list-runs --registry $ACR_NAME --output table

Если вы закончили работу с предыдущим руководством (и не удалили реестр), вы должны увидеть выходные данные, похожие на приведенные ниже. Обратите внимание на количество запусков задач и последний идентификатор выполнения, чтобы сравнить результаты после обновления базового образа в следующем разделе.

az acr task list-runs --registry $ACR_NAME --output table
UN ID    TASK            PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
ca12      baseexample2    linux       Succeeded  Manual        2020-11-21T00:00:56Z  00:00:36
ca11      baseexample1    linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:34
ca10      taskhelloworld  linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:24
cay                       linux       Succeeded  Manual        2020-11-20T23:38:08Z  00:00:22
cax       baseexample1    linux       Succeeded  Manual        2020-11-20T23:33:12Z  00:00:30
caw       taskhelloworld  linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:29

Обновление базового образа

Здесь вы эмулируете исправление (патч) фреймворка в базовом образе. Измените файл Dockerfile-base, добавив "a" после номера версии, определенного в NODE_VERSION:

ENV NODE_VERSION 15.2.1a

Запустите функцию быстрой задачи, чтобы создать измененный базовый образ. Обратите внимание на ИД запуска в выходных данных.

az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .

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

Список обновленной версии сборки

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

az acr task list-runs --registry $ACR_NAME --output table

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

az acr task list-runs --registry $ACR_NAME --output table
         PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
ca13      baseexample2    linux       Succeeded  Image Update  2020-11-21T00:06:00Z  00:00:43
ca12      baseexample2    linux       Succeeded  Manual        2020-11-21T00:00:56Z  00:00:36
ca11      baseexample1    linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:34
ca10      taskhelloworld  linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:24
cay                       linux       Succeeded  Manual        2020-11-20T23:38:08Z  00:00:22
cax       baseexample1    linux       Succeeded  Manual        2020-11-20T23:33:12Z  00:00:30
caw       taskhelloworld  linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:29

Если вы хотите выполнить следующий необязательный шаг запуска нового контейнера, чтобы просмотреть обновленный номер версии, запишите значение run ID для сборки, активировавшей обновление образа (в предыдущих выходных данных — ca13).

Необязательно. Запуск только что созданного образа

Если вы работаете локально (не в облачной среде Cloud Shell) и у вас установлен Docker, запустите новый образ приложения после завершения его сборки. Замените код <run-id> идентификатором запуска, полученным на предыдущем шаге. Если вы используете Cloud Shell, пропустите этот раздел (Cloud Shell не поддерживает docker run).

docker run -d -p 8081:80 --name updatedapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>

Перейдите по адресу http://localhost:8081 в браузере, и вы увидите обновленный номер версии Node.js (с добавленным значением "а") на веб-странице:

Снимок экрана: обновленный пример приложения в браузере

Важно отметить, что вы обновили базовый образ с помощью нового номера версии, но новая версия отображается в последнем созданном образе приложения. Решение "Задачи ACR" обнаружило изменение базового образа и автоматически перестроило образ приложения.

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

docker stop updatedapp

Дальнейшие шаги

Из этого руководства вы узнали, как использовать задачу, чтобы автоматически запускать сборку образа контейнера, когда обновляется базовый образ. Теперь перейдите к следующему учебнику, чтобы узнать, как активировать задачи по определенному расписанию.