Tutorial: Automatizar compilações de imagens de contentor quando uma imagem de base é atualizada noutro registo de contentor privado

O ACR Tasks suporta compilações de imagens automatizadas quando a imagem de base de um contentor é atualizada, como quando corre o SO ou a arquitetura da aplicação numa das suas imagens de base.

Neste tutorial, vai aprender a criar uma tarefa do ACR que aciona uma compilação na cloud quando a imagem de base de um contentor é enviada para outro registo de contentor do Azure. Também pode experimentar um tutorial para criar uma tarefa do ACR que aciona uma compilação de imagem quando uma imagem de base é enviada para o mesmo registo de contentor do Azure.

Neste tutorial:

  • Criar a imagem de base num registo base
  • Criar uma tarefa de compilação de aplicação noutro registo para controlar a imagem de base
  • Atualizar a imagem de base para acionar uma tarefa das imagens da aplicação
  • Apresentar a tarefa acionada
  • Verificar a imagem da aplicação atualizada

Pré-requisitos

Concluir os tutoriais anteriores

Este tutorial pressupõe que já configurou o seu ambiente e concluiu os passos nos dois primeiros tutoriais da série, nos quais:

  • Criar um registo de contentor do Azure
  • Bifurcar um repositório de exemplo
  • Clonar um repositório de exemplo
  • Criar token de acesso pessoal do GitHub

Se ainda não o fez, conclua os seguintes tutoriais antes de continuar:

Compilar imagens de contentor na cloud com o Azure Container Registry Tasks

Automatizar as compilações da imagem de contentor com o Azure Container Registry Tasks

Além do registo de contentor criado para os tutoriais anteriores, tem de criar um registo para armazenar as imagens de base. Se quiser, crie o segundo registo numa localização diferente do registo original.

Configurar o ambiente

Preencha estas variáveis de ambiente da shell com os valores adequados para o seu ambiente. Este passo não é estritamente necessário, mas facilita um pouco a execução dos comandos da CLI do Azure com várias linhas neste tutorial. Se não preencher estas variáveis de ambiente, tem de substituir manualmente cada valor onde for apresentado nos comandos de exemplo.

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

Cenário de atualização da imagem de base

Este tutorial orienta-o através de um cenário de atualização da imagem de base. Este cenário reflete um fluxo de trabalho de desenvolvimento para gerir imagens de base num registo de contentor privado comum ao criar imagens da aplicação noutros registos. As imagens de base podem especificar sistemas operativos e arquiteturas comuns utilizados por uma equipa ou até mesmo componentes de serviço comuns.

Por exemplo, os programadores que desenvolvem imagens de aplicações nos seus próprios registos podem aceder a um conjunto de imagens de base mantidas no registo base comum. O registo base pode estar noutra região ou até mesmo georreplicado.

O exemplo de código inclui dois Dockerfiles: uma imagem da aplicação e uma imagem que é especificada como a sua base. Nas secções seguintes, vai criar uma tarefa do ACR que aciona automaticamente uma compilação da imagem da aplicação quando uma nova versão da imagem de base é enviada para um registo de contentor do Azure diferente.

  • Dockerfile-app: uma pequena aplicação Web Node.js que compõe uma página Web estática, que apresenta a versão do Node.js na qual se baseia. A cadeia de versão é simulada: apresenta o conteúdo de uma variável de ambiente, NODE_VERSION, definido na imagem de base.

  • Dockerfile-base: a imagem que Dockerfile-app especifica como a sua base. A própria baseia-se numa imagem do e inclui a variável de ambiente NODE_VERSION.

Nas próximas secções, vai criar uma tarefa, atualizar o valor NODE_VERSION no Dockerfile da imagem de base e, em seguida, utilizar o ACR Tasks para compilar a imagem de base. Quando a tarefa do ACR envia a nova imagem de base para o registo, aciona automaticamente uma compilação da imagem da aplicação. Opcionalmente, pode executar a imagem de contentor da aplicação localmente para ver as diferentes cadeias de versão nas imagens da compilação.

Neste tutorial, a sua tarefa do ACR cria e emite uma imagem de contentor de aplicação especificada num Dockerfile. O ACR Tasks também pode executar tarefas de vários passos, utilizando um ficheiro YAML para definir passos para criar, emitir e testar opcionalmente vários contentores.

Compilar a imagem de base

Comece por criar a imagem de base com uma tarefa rápida do ACR Tasks, com az acr build. Tal como explicado no primeiro tutorial da série, este processo não só compila a imagem como a envia para o seu registo de contentor, caso a compilação seja concluída com êxito. Neste exemplo, a imagem é enviada para o registo de imagem de base.

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

Criar uma tarefa para controlar a imagem de base privada

Em seguida, crie uma tarefa no registo de imagem da aplicação com az acr task create, ativando uma identidade gerida. A identidade gerida é utilizada em passos posteriores para que a tarefa seja autenticada com o registo de imagem de base.

Este exemplo utiliza uma identidade atribuída pelo sistema, mas pode criar e ativar uma identidade gerida atribuída pelo utilizador para determinados cenários. Para obter detalhes, veja Autenticação entre registos numa tarefa do ACR com uma identidade gerida pelo 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

Esta tarefa é semelhante à tarefa criada no tutorial anterior. Dá instruções ao ACR Tasks para acionar uma compilação da imagem quando as consolidações são enviadas por push para o repositório especificado por --context. Embora o Dockerfile utilizado para compilar a imagem no tutorial anterior especifique uma imagem de base pública (FROM node:15-alpine), o Dockerfile nesta tarefa, Dockerfile-app, especifica uma imagem de base no registo de imagem de base:

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

Esta configuração facilita a simulação de um patch de arquitetura na imagem de base mais à frente neste tutorial.

Conceder permissões de solicitação de identidade ao registo base

Para conceder permissões de identidade gerida da tarefa para extrair imagens do registo de imagem de base, execute primeiro az acr task show para obter o ID do principal de serviço da identidade. Em seguida, execute az acr show para obter o ID de recurso do registo base:

# 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) 

Atribua as permissões de solicitação de identidade gerida ao registo ao executar az role assignment create:

az role assignment create \
  --assignee $principalID \
  --scope $baseregID --role acrpull 

Adicionar credenciais de registo de destino à tarefa

Execute az acr task credential add para adicionar credenciais à tarefa. Transmita o --use-identity [system] parâmetro para indicar que a identidade gerida atribuída pelo sistema da tarefa pode aceder às credenciais.

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

Executar manualmente a tarefa

Utilize az acr task run para acionar manualmente a tarefa e criar a imagem da aplicação. Este passo é necessário para que a tarefa acompanhe a dependência da imagem da aplicação na imagem de base.

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

Depois de concluída a tarefa, tome nota do ID de Execução (por exemplo, "da6") se quiser concluir o passo opcional seguinte.

Opcional: executar o contentor da aplicação localmente

Se estiver a trabalhar localmente (não estiver no Cloud Shell) e tiver o Docker instalado, execute o contentor para ver a aplicação composta num browser, antes de recompilar a imagem de base. Se estiver a utilizar o Cloud Shell, ignore esta secção (o Cloud Shell não suporta az acr login nem docker run).

Primeiro, autentique-se no seu registo de contentor com az acr login:

az acr login --name $ACR_NAME

Agora, execute o contentor localmente com docker run. Substitua <run-id> pelo ID de Execução encontrado no resultado do passo anterior (por exemplo, "da6"). Este exemplo dá um nome ao contentor myapp e inclui o --rm parâmetro para remover o contentor quando o parar.

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

Navegue para http://localhost:8080 no browser, deverá ver o número de versão do Node.js composto na página Web, semelhante ao que se segue. Num passo posterior, pode efetuar o bump da versão ao adicionar um “a” na cadeia de versão.

Captura de ecrã da aplicação de exemplo no browser

Para parar e remover o contentor, execute o seguinte comando:

docker stop myapp

Listar as compilações

Em seguida, liste as execuções de tarefas que o ACR Tasks concluiu para o seu registo com o comando az acr task list-runs:

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

Se tiver concluído o tutorial anterior (e não tiver eliminado o registo), deverá ver um resultado semelhante ao seguinte. Tome nota do número de execuções da tarefa e do ID DE EXECUÇÃO mais recente para poder comparar o resultado depois de atualizar a imagem de base na próxima secção.

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

Atualizar a imagem de base

Nesta secção, vai simular uma correção da estrutura na imagem de base. Edite Dockerfile-base e adicione um “a” depois do número de versão definido em NODE_VERSION:

ENV NODE_VERSION 15.2.1a

Execute uma tarefa rápida para compilar a imagem de base modificada. Tome nota do ID de Execução no resultado.

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

Depois de concluída a compilação e a nova imagem de base ter sido enviada para o registo, a tarefa do ACR aciona uma compilação da imagem da aplicação. Pode demorar algum tempo para que a tarefa criada anteriormente acione a compilação da imagem da aplicação, porque tem de detetar a imagem de base recentemente compilada e enviada.

Listar a compilação atualizada

Agora que atualizou a imagem de base, liste as execuções de tarefas novamente para compará-las à lista anterior. Se, à primeira, o resultado não for diferente, execute periodicamente o comando para ver a nova execução de tarefa aparecer na lista.

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

O resultado é semelhante ao seguinte. O ACIONADOR da última compilação executada deve ser "Atualizar Imagem", que indica que a tarefa foi iniciada pela tarefa rápida da imagem de base.

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

Se quiser executar o seguinte passo opcional para executar o contentor recém-criado para ver o número da versão atualizada, tome nota do valor do ID DE EXECUÇÃO da compilação acionada pela Atualização de Imagens (no resultado anterior, é "ca13").

Opcional: executar a imagem recém-compilada

Se estiver a trabalhar localmente (não estiver no Cloud Shell) e tiver o Docker instalado, execute a nova imagem da aplicação depois de concluída a sua compilação. Substitua <run-id> pelo ID DE EXECUÇÃO que obteve no passo anterior. Se estiver a utilizar o Cloud Shell, ignore esta secção (o Cloud Shell não suporta docker run).

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

Navegue para http://localhost:8081 no browser, deverá ver o número de versão do Node.js atualizado (com o “a”) na página Web:

Captura de ecrã da aplicação de exemplo atualizada no browser

O que é importante ter em atenção é que atualizou a imagem de base com um novo número de versão, mas a imagem da aplicação da última compilação apresenta a nova versão. O ACR Tasks captou a alteração para a imagem de base e recompilou automaticamente a imagem da aplicação.

Para parar e remover o contentor, execute o seguinte comando:

docker stop updatedapp

Passos seguintes

Neste tutorial, aprendeu a utilizar uma tarefa para acionar automaticamente compilações da imagem de contentor quando a imagem de base é atualizada. Agora, avance para o próximo tutorial para saber como acionar tarefas numa agenda definida.