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


Руководство по автоматизации сборок образов контейнера при обновлении базового образа в службе "Реестр контейнеров Azure"

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

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

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

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

Предварительные требования

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

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

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

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

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

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

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

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см. в статье Краткое руководство по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в разделе Запуск Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, приведены в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

  • Для работы с этой статьей требуется Azure CLI версии 2.0.46 или более поздней. Если вы используете Azure Cloud Shell, последняя версия уже установлена.

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

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

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

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

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

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

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

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

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

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

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

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

Создание задачи

Далее с помощью команды az acr task create создайте задачу:

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

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

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

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

Сборка контейнера приложения

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

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

По завершении сборки запишите ИД запуска (например, "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-run:

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

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

RUN ID    TASK            PLATFORM    STATUS     TRIGGER    STARTED               DURATION
--------  --------------  ----------  ---------  ---------  --------------------  ----------
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
cav       example2        linux       Succeeded  Commit     2020-11-20T23:16:07Z  00:00:55
cau       example1        linux       Succeeded  Commit     2020-11-20T23:16:07Z  00:00:40
cat       taskhelloworld  linux       Succeeded  Manual     2020-11-20T23:07:29Z  00:00:27

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

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

ENV NODE_VERSION 15.2.1a

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

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

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

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

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

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

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

Run ID    TASK            PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
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
cav       example2        linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:55
cau       example1        linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:40
cat       taskhelloworld  linux       Succeeded  Manual        2020-11-20T23:07:29Z  00:00:27

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

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

Если вы работаете локально (не в облачной среде 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

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

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

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

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

Run an ACR task on a defined schedule (Выполнение задачи записи контроля доступа по определенному расписанию)