Partilhar via


Tutorial: Compilar e implementar imagens de contentor na cloud com Tarefas do Azure Container Registry

O ACR Tasks é um conjunto de funcionalidades no Azure Container Registry que fornece compilações de imagens do contentor de Docker simplificadas e eficientes no Azure. Neste artigo, vai aprender a utilizar a funcionalidade tarefa rápida do ACR Tasks.

O ciclo de desenvolvimento "inner-loop" é o processo iterativo de escrita de código, compilação e teste da sua aplicação antes de fazer commit no controlo de versão. Uma tarefa breve expande o seu ciclo de desenvolvimento para a cloud, fornecendo-lhe a validação do sucesso da compilação e o envio automático de imagens construídas com sucesso para o registo de contentores. As imagens são compiladas de forma nativa na cloud, junto do seu registo, o que permite uma implementação mais rápida.

Todos os seus conhecimentos do Dockerfile podem ser transferidos diretamente para o ACR Tasks. Não tem de alterar o Dockerfiles para compilar na cloud com o ACR Tasks, apenas o comando que está a executar.

Neste tutorial, a primeira parte de uma série:

  • Obter o código de origem da aplicação de exemplo
  • Compilar uma imagem do contentor no Azure
  • Implementar um contentor no Azure Container Instances

Nos tutoriais subsequentes, vai aprender a utilizar o ACR Tasks para obter compilações automatizadas de imagens do contentor após a consolidação do código e a atualização da imagem de base. As Tarefas ACR também podem executar tarefas de várias etapas, usando um arquivo YAML para definir etapas para criar, enviar por push e, opcionalmente, testar vários contêineres.

Pré-requisitos

Conta do GitHub

Crie uma conta em https://github.com, se ainda não tiver uma. Esta série de tutoriais utiliza um repositório de GitHub para demonstrar as compilações de imagens automatizadas no ACR Tasks.

Bifurcar um repositório de exemplo

Em seguida, utilize a IU do GitHub para fazer um fork do repositório de exemplo na sua conta do GitHub. Neste tutorial, vai criar uma imagem de contêiner a partir da origem no repositório e, no tutorial seguinte, vai fazer push de um commit para o seu fork do repositório para iniciar uma tarefa automatizada.

Bifurcar este repositório: https://github.com/Azure-Samples/acr-build-helloworld-node

Captura de ecrã do botão Bifurcar (realçado) no GitHub

Clonar o fork

Depois de bifurcar o repositório, clone o seu fork e entre no diretório que contém o clone local.

Clone o repositório com git, substitua <your-github-username> pelo nome de utilizador do GitHub:

git clone https://github.com/<your-github-username>/acr-build-helloworld-node

Introduza o diretório que contém o código de origem:

cd acr-build-helloworld-node

Shell Bash

Os comandos nesta série de tutoriais estão formatados para a shell do Bash. Se preferir utilizar o PowerShell, a Linha de Comandos ou outra shell, poderá ter de ajustar o formato da continuação de linha e da variável de ambiente em conformidade.

Prepare o seu ambiente para o CLI do Azure

Criar no Azure com ACR Tasks

Agora que já descarregou o código de origem para o seu computador, siga estes passos para criar um registo do contentor e compilar a imagem do contentor com o ACR Tasks.

Para a execução dos comandos de exemplo ser mais fácil, os tutoriais nesta série utilizam variáveis de ambiente da shell. Execute o comando seguinte para definir a variável ACR_NAME. Substitua <registry-name> por um nome exclusivo para o novo registo de contentor. O nome do Registro deve ser exclusivo no Azure, conter apenas letras minúsculas e conter de 5 a 50 caracteres alfanuméricos. Os outros recursos que criar no tutorial baseiam-se neste nome, pelo que necessita de modificar apenas esta primeira variável.

ACR_NAME=<registry-name>

Com a variável de ambiente de registo de contentor preenchida, deve agora poder copiar e colar o resto dos comandos no tutorial sem editar nenhum dos valores. Execute os seguintes comandos para criar um grupo de recursos e um registro de contêiner.

RES_GROUP=$ACR_NAME # Resource Group name

az group create --resource-group $RES_GROUP --location eastus
az acr create --resource-group $RES_GROUP --name $ACR_NAME --sku Standard --location eastus

Agora que tem um registo, utilize o ACR Tasks para compilar uma imagem do contentor a partir do código de exemplo. Execute o comando az acr build para executar uma tarefa rápida.

Nota

O Dockerfile usado no exemplo a seguir depende de uma imagem de contêiner base pública do Docker Hub. Para melhorar a confiabilidade ao usar conteúdo público, importe e gerencie a imagem em um registro de contêiner privado do Azure e atualize seu Dockerfile para usar sua imagem base gerenciada privadamente. Saiba mais sobre como trabalhar com imagens públicas.

az acr build --registry $ACR_NAME --image helloacrtasks:v1 --file /path/to/Dockerfile /path/to/build/context.

O resultado do comando az acr build é semelhante ao seguinte. Pode ver o carregamento do código de origem (o “contexto”) para o Azure e os detalhes da operação docker build que o ACR Tasks executa na cloud. Uma vez que o ACR Tasks utiliza docker build para compilar as suas imagens, não são necessárias alterações ao Dockerfiles para começar a utilizar imediatamente o ACR Tasks.

Packing source code into tar file to upload...
Sending build context (4.813 KiB) to ACR...
Queued a build with build ID: da1
Waiting for build agent...
2020/11/18 18:31:42 Using acb_vol_01185991-be5f-42f0-9403-a36bb997ff35 as the home volume
2020/11/18 18:31:42 Setting up Docker configuration...
2020/11/18 18:31:43 Successfully set up Docker configuration
2020/11/18 18:31:43 Logging in to registry: myregistry.azurecr.io
2020/11/18 18:31:55 Successfully logged in
Sending build context to Docker daemon   21.5kB
Step 1/5 : FROM node:15-alpine
15-alpine: Pulling from library/node
Digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
Status: Image is up to date for node:15-alpine
 ---> a56170f59699
Step 2/5 : COPY . /src
 ---> 88087d7e709a
Step 3/5 : RUN cd /src && npm install
 ---> Running in e80e1263ce9a
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN helloworld@1.0.0 No repository field.

up to date in 0.1s
Removing intermediate container e80e1263ce9a
 ---> 26aac291c02e
Step 4/5 : EXPOSE 80
 ---> Running in 318fb4c124ac
Removing intermediate container 318fb4c124ac
 ---> 113e157d0d5a
Step 5/5 : CMD ["node", "/src/server.js"]
 ---> Running in fe7027a11787
Removing intermediate container fe7027a11787
 ---> 20a27b90eb29
Successfully built 20a27b90eb29
Successfully tagged myregistry.azurecr.io/helloacrtasks:v1
2020/11/18 18:32:11 Pushing image: myregistry.azurecr.io/helloacrtasks:v1, attempt 1
The push refers to repository [myregistry.azurecr.io/helloacrtasks]
6428a18b7034: Preparing
c44b9827df52: Preparing
172ed8ca5e43: Preparing
8c9992f4e5dd: Preparing
8dfad2055603: Preparing
c44b9827df52: Pushed
172ed8ca5e43: Pushed
8dfad2055603: Pushed
6428a18b7034: Pushed
8c9992f4e5dd: Pushed
v1: digest: sha256:b038dcaa72b2889f56deaff7fa675f58c7c666041584f706c783a3958c4ac8d1 size: 1366
2020/11/18 18:32:43 Successfully pushed image: myregistry.azurecr.io/helloacrtasks:v1
2020/11/18 18:32:43 Step ID acb_step_0 marked as successful (elapsed time in seconds: 15.648945)
The following dependencies were found:
- image:
    registry: myregistry.azurecr.io
    repository: helloacrtasks
    tag: v1
    digest: sha256:b038dcaa72b2889f56deaff7fa675f58c7c666041584f706c783a3958c4ac8d1
  runtime-dependency:
    registry: registry.hub.docker.com
    repository: library/node
    tag: 15-alpine
    digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
  git: {}

Run ID: da1 was successful after 1m9.970148252s

Perto do final do resultado, o ACR Tasks mostra as dependências que detetou para a imagem. As Tarefas ACR permitem automatizar as compilações de imagens com as atualizações das imagens de base, como quando uma imagem de base é atualizada com patches do SO ou do framework. Mais adiante nesta série de tutoriais, vai obter informações sobre o suporte do ACR Tasks para as atualizações das imagens de base.

Desempenhar em instâncias de contêiner do Azure

Por predefinição, o ACR Tasks envia automaticamente imagens compiladas com êxito para o seu registo, permitindo-lhe implementá-las de imediato a partir do registo.

Nesta secção, irá criar um Azure Key Vault e um principal de serviço e, em seguida, implementará o contentor no Azure Container Instances (ACI) ao utilizar as credenciais do principal de serviço.

Configurar a autenticação do registo

Todos os cenários de produção devem utilizar identidades de serviço para aceder ao registo de contentores do Azure. Os principais de serviço permitem-lhe ter controlo de acesso baseado em funções sobre as imagens de contentor. Por exemplo, pode configurar um principal de serviço com acesso a um registo apenas por pedido.

Criar um cofre de chaves

Se ainda não tiver um cofre no Azure Key Vault, crie um com a CLI do Azure através dos comandos seguintes.

AKV_NAME=$ACR_NAME-vault

az keyvault create --resource-group $RES_GROUP --name $AKV_NAME

Criar um principal de serviço e armazenar as credenciais

Agora é necessário criar um principal de serviço e armazenar suas credenciais no cofre de chaves.

Use o comando az ad sp create-for-rbac para criar a entidade de serviço e az keyvault secret set para armazenar a senha da entidade de serviço no cofre. Use a CLI do Azure versão 2.25.0 ou posterior para estes comandos:

A função correta a ser usada na atribuição de função depende se o registro está habilitado para ABAC ou não.

# Create service principal, store its password in AKV (the registry *password*)
ROLE="Container Registry Repository Reader" # For ABAC-enabled registries. For non-ABAC registries, use AcrPull.
az keyvault secret set \
  --vault-name $AKV_NAME \
  --name $ACR_NAME-pull-pwd \
  --value $(az ad sp create-for-rbac \
                --name $ACR_NAME-pull \
                --scopes $(az acr show --name $ACR_NAME --query id --output tsv) \
                --role "$ROLE" \
                --query password \
                --output tsv)

O --role argumento no comando anterior configura o principal de serviço com uma função incorporada para conceder-lhe acesso apenas de leitura ao registo. A função correta para usar na atribuição de função depende de se o registo está habilitado para ABAC ou não, com registos habilitados para ABAC precisando da função Container Registry Repository Reader e registos não habilitados para ABAC precisando da função AcrPull.

Para conceder acesso push e pull, mude o argumento --role para a função Container Registry Repository Writer para registos compatíveis com ABAC ou para a função AcrPush para registos não compatíveis com ABAC.

Para obter mais informações sobre o Microsoft Entra ABAC, consulte Permissões de repositório baseadas no Microsoft Entra.

Em seguida, armazene o appId do serviço principal no cofre, que é o nome de utilizador que passa ao Azure Container Registry para autenticação.

# Store service principal ID in AKV (the registry *username*)
az keyvault secret set \
    --vault-name $AKV_NAME \
    --name $ACR_NAME-pull-usr \
    --value $(az ad sp list --display-name $ACR_NAME-pull --query [].appId --output tsv)

Acabou de criar um Azure Key Vault e de armazenar dois segredos nele:

  • $ACR_NAME-pull-usr: o ID do principal de serviço, para utilização como o nome de utilizador do registo de contentor.
  • $ACR_NAME-pull-pwd: a palavra-passe do principal de serviço, para utilização como a palavra-passe do registo de contentor.

Agora, pode referenciar esses segredos pelo nome quando você ou as suas aplicações e serviços solicitam imagens do registo.

Implementar um contentor com a CLI do Azure

Agora que as credenciais do principal de serviço estão armazenadas como segredos no Azure Key Vault, as aplicações e os serviços podem utilizá-las para aceder ao registo privado.

Execute o comando seguinte az container create para implementar uma instância de contentor. O comando utiliza as credenciais do principal de serviço armazenadas no Azure Key Vault para autenticar no registo de contentor.

az container create \
    --resource-group $RES_GROUP \
    --name acr-tasks \
    --image $ACR_NAME.azurecr.io/helloacrtasks:v1 \
    --registry-login-server $ACR_NAME.azurecr.io \
    --registry-username $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-usr --query value -o tsv) \
    --registry-password $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-pwd --query value -o tsv) \
    --dns-name-label acr-tasks-$ACR_NAME \
    --query "{FQDN:ipAddress.fqdn}" \
    --output table

O valor --dns-name-label tem de ser exclusivo no Azure, para que o comando anterior acrescente o nome do registo de contentor à etiqueta de nome DNS do contentor. O resultado do comando apresenta o nome de domínio completamente qualificado (FQDN) do contentor, por exemplo:

FQDN
----------------------------------------------
acr-tasks-myregistry.eastus.azurecontainer.io

Tome nota do FQDN do contentor, vai utilizá-lo na próxima secção.

Verificar a implementação

Para ver o processo de arranque do contentor, utilize o comando az container attach:

az container attach --resource-group $RES_GROUP --name acr-tasks

A az container attach saída primeiro exibe o estado do contentor enquanto este faz o download da imagem e é iniciado, e depois liga o STDOUT e o STDERR da consola local aos do contentor.

Container 'acr-tasks' is in state 'Running'...
(count: 1) (last timestamp: 2020-11-18 18:39:10+00:00) pulling image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2020-11-18 18:39:15+00:00) Successfully pulled image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2020-11-18 18:39:17+00:00) Created container
(count: 1) (last timestamp: 2020-11-18 18:39:17+00:00) Started container

Start streaming logs:
Server running at http://localhost:80

Quando Server running at http://localhost:80 for apresentado, navegue para o FQDN do contentor no browser para ver a aplicação em execução. O FQDN devia ter sido apresentado como resultado do comando az container create que executou na secção anterior.

Aplicativo de exemplo em execução no navegador

Para desligar a consola do contentor, prima Control+C.

Limpar recursos

Pare a instância de contentor com o comando az container delete:

az container delete --resource-group $RES_GROUP --name acr-tasks

Para remover todos os recursos que criou neste tutorial, incluindo o registo de contentor, o cofre de chaves e o principal de serviço, emita os comandos seguintes. No entanto, estes recursos serão utilizados no próximo tutorial da série, por isso, poderá querer mantê-los se avançar diretamente para o próximo tutorial.

az group delete --resource-group $RES_GROUP
az ad sp delete --id http://$ACR_NAME-pull

Próximos passos

Agora que testou o ciclo interno com uma tarefa rápida, configure uma tarefa de compilação para acionar compilações de imagens do contentor quando consolida código de origem para um repositório de Git: