Руководство. Автоматизация сборок образов контейнеров при обновлении базового образа в реестре контейнеров Azure
Решение Задачи ACR поддерживает автоматическую сборку образа контейнера при обновлении базового образа контейнера, например, когда вы исправляете ОС или исполняющую среду в одном из базовых образов.
Из этого учебника вы узнаете, как создать задачу ACR, которая запускает сборку в облаке при отправке базового образа контейнера в тот же реестр. В другом учебнике описано, как создать задачу ACR, которая запускает сборку образа при отправке базового образа контейнера в другой реестр контейнеров Azure.
В этом руководстве рассматриваются следующие темы:
- создание базового образа;
- Создание образа приложения в том же реестре, который отслеживает базовый образ
- обновление базового образа для запуска задачи образа приложения;
- отображение активированной задачи;
- проверка обновленного образа приложения.
Необходимые компоненты
Завершение работы с предыдущими руководствами
В этом руководстве предполагается, что вы уже настроили среду и выполнили следующие шаги, описанные в первых двух руководствах в серии:
- Создание реестра контейнеров Azure
- Создание вилки примера репозитория
- Клонировали пример репозитория.
- Создали личный маркер доступа GitHub.
Если вы еще этого не сделали, выполните инструкции из следующих учебников, прежде чем продолжить:
Настройка среды
Используйте среду 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 (Выполнение задачи записи контроля доступа по определенному расписанию)