Tutoriel : Automatiser la génération des images conteneur quand une image de base est mise à jour dans un autre registre de conteneurs privé
ACR Tasks prend en charge la génération automatisée d’images quand l’image de base d’un conteneur est mise à jour, par exemple quand vous corrigez le système d’exploitation ou l’infrastructure d’application dans l’une de vos images de base.
Dans ce tutoriel, vous allez découvrir comment créer une tâche ACR qui déclenche une génération dans le cloud lorsque l’image de base d’un conteneur est envoyée (push) vers un autre registre de conteneurs Azure. Vous pouvez également essayer de suivre un tutoriel pour créer une tâche ACR qui déclenche une génération d’image quand une image de base est envoyée (push) au même registre de conteneurs Azure.
Dans ce tutoriel, vous allez :
- Générer l’image de base dans un registre de base
- Créer une tâche de génération d’application dans un autre registre pour suivre l’image de base
- Mettre à jour l’image de base pour déclencher la génération d’une tâche d’image d’application
- Afficher la tâche déclenchée
- Vérifier l’image d’application mise à jour
Prérequis
Terminer les didacticiels précédents
Pour suivre ce tutoriel, vous devez avoir déjà configuré votre environnement et effectué les étapes des deux premiers tutoriels de la série, dans lesquels vous avez appris à :
- Créer un registre de conteneurs Azure
- Dupliquer l’exemple de référentiel
- Cloner l’exemple de référentiel
- Créer un jeton d’accès personnel GitHub
Si vous ne l’avez pas encore fait, suivez les tutoriels ci-après avant de continuer :
Générer des images de conteneur dans le cloud avec Azure Container Registry Tasks
Automatiser la génération des images de conteneur avec Azure Container Registry Tasks
En plus du registre de conteneurs créé pour les tutoriels précédents, vous devez créer un registre pour stocker les images de base. Si vous le souhaitez, créez le deuxième registre à un autre emplacement que le registre d’origine.
Configurer l’environnement
Renseignez ces variables d’environnement shell avec des valeurs appropriées pour votre environnement. Cette étape n’est pas strictement obligatoire, mais facilite un peu l’exécution des commandes multilignes de l’interface de ligne de commande Azure de ce didacticiel. Si vous ne renseignez pas ces variables d’environnement, vous devrez remplacer manuellement chaque valeur à chaque fois qu’elle apparaît dans les exemples de commandes.
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
Scénario de mise à jour d’une image de base
Ce didacticiel vous guide dans un scénario de mise à jour d’une image de base. Ce scénario reflète un flux de travail de développement pour gérer les images de base dans un registre de conteneurs privé commun lors de la création d’images d’application dans d’autres registres. Les images de base peuvent spécifier des systèmes d’exploitation et des infrastructures communs utilisés par une équipe, ou même des composants de service communs.
Par exemple, les développeurs qui développent des images d’application dans leurs propres registres peuvent accéder à un ensemble d’images de base conservées dans le registre de base commun. Le registre de base peut être dans une autre région, voire même géorépliqué.
L’exemple de code comprend deux fichiers Dockerfile : une image d’application et une image spécifiée comme image de base. Dans les sections suivantes, vous allez créer une tâche ACR qui déclenche automatiquement une génération de l’image d’application lorsqu’une nouvelle version de l’image de base est envoyée (push) vers un autre registre de conteneurs Azure.
Dockerfile-app : Une petite application web Node.js qui restitue une page web statique en affichant la version de Node.js sur laquelle elle est basée. La chaîne de version est simulée : elle affiche le contenu d’une variable d’environnement,
NODE_VERSION
, qui est définie dans l’image de base.Dockerfile-base : Image spécifiée par
Dockerfile-app
comme son image de base. Elle est elle-même basée sur une image Nœud et inclut la variable d’environnementNODE_VERSION
.
Dans les sections suivantes, vous allez créer une tâche, mettre à jour la valeur NODE_VERSION
dans le fichier Dockerfile d’image de base, puis utiliser ACR Tasks pour générer l’image de base. Lorsqu’ACR Tasks envoie la nouvelle image de base dans le registre, il déclenche automatiquement une génération de l’image de l’application. Si vous le souhaitez, vous pouvez exécuter l’image de conteneur d’application en local pour voir les différentes chaînes de version dans les images générées.
Dans ce tutoriel, votre tâche ACR génère et envoie (push) une image conteneur d’application spécifiée dans un Dockerfile. ACR Tasks peut également exécuter des tâches multiétapes à l’aide d’un fichier YAML pour définir les étapes permettant de générer, d’envoyer en mode push et éventuellement de tester plusieurs conteneurs.
Générer l’image de base
Commencez par générer l’image de base avec une tâche rapide d’ACR Tasks, en utilisant az acr build. Comme indiqué dans le premier didacticiel de la série, ce processus génère non seulement l’image, mais l’envoie vers le registre de conteneurs si la génération est réussie. Dans cet exemple, l’image est envoyée en mode push dans le registre d’images de base.
az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .
Créer une tâche pour effectuer le suivi de l’image de base privée
Ensuite, créez une tâche dans le registre d’images d’application avec az acr task create, en activant une identité managée. L’identité managée est utilisée dans les étapes ultérieures afin que la tâche s’authentifie avec le registre d’images de base.
Cet exemple utilise une identité affectée par le système, mais vous pouvez créer et activer une identité managée affectée par l’utilisateur pour certains scénarios. Pour plus de détails, consultez Authentification multiregistre dans une tâche ACR à l’aide d’une identité managée par 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
Cette tâche est similaire à la tâche créée dans le tutoriel précédent. Elle demande à ACR Tasks de déclencher une génération d’image lorsque les validations sont envoyées vers le référentiel spécifié par --context
. Alors que le fichier Dockerfile utilisé pour générer l’image dans le tutoriel précédent spécifie une image de base publique (FROM node:15-alpine
), le fichier Dockerfile dans cette tâche, Dockerfile-app, spécifie une image de base dans le registre d’images de base :
FROM ${REGISTRY_NAME}/baseimages/node:15-alpine
Cette configuration facilite la simulation d’un correctif de framework dans l’image de base ultérieurement dans ce tutoriel.
Accorder des autorisations d’extraction d’identité au registre de base
Pour accorder à l’identité managée de la tâche l’autorisation d’extraire des images du registre d’images de base, commencez par exécuter az acr task show pour obtenir l’ID de principal de service de l’identité. Ensuite, exécutez az acr show pour obtenir l’ID de ressource du registre de 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)
Affectez les autorisations d’extraction d’identité managée au registre en exécutant az role assignment create :
az role assignment create \
--assignee $principalID \
--scope $baseregID --role acrpull
Ajouter des informations d’identification de registre cible à la tâche
Exécutez az acr task credential add pour ajouter des informations d’identification à la tâche. Transmettez le paramètre --use-identity [system]
pour indiquer que l’identité managée affectée par le système de la tâche peut accéder aux informations d’identification.
az acr task credential add \
--name baseexample2 \
--registry $ACR_NAME \
--login-server $BASE_ACR.azurecr.io \
--use-identity [system]
Exécuter manuellement la tâche
Utilisez la commande az acr task run pour déclencher manuellement la tâche et générer l’image de l’application. Cette étape est requise pour que la tâche suive la dépendance de l’image d’application par rapport à l’image de base.
az acr task run --registry $ACR_NAME --name baseexample2
Une fois la tâche terminée, prenez note de l’ID d’exécution (par exemple, « da6 ») si vous souhaitez terminer l’étape facultative suivante.
Facultatif : Exécuter localement un conteneur d’application
Si vous travaillez localement (pas dans Cloud Shell) et si vous avez installé Docker, exécutez le conteneur pour voir l’application affichée dans un navigateur web avant de régénérer son image de base. Si vous utilisez Cloud Shell, ignorez cette section (Cloud Shell ne prend en charge ni az acr login
ni docker run
).
Tout d’abord, connectez-vous au registre de conteneurs à l’aide de la commande az acr login :
az acr login --name $ACR_NAME
À présent, exécutez localement le conteneur avec docker run
. Remplacez <run-id> par l’ID d’exécution trouvé dans la sortie de l’étape précédente (par exemple, « da6 »). Cet exemple nomme le conteneur myapp
et inclut le paramètre --rm
pour supprimer le conteneur lorsque vous l’arrêtez.
docker run -d -p 8080:80 --name myapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>
Accédez à http://localhost:8080
dans le navigateur ; vous devez voir le numéro de version Node.js affiché dans la page web, comme dans l’exemple suivant. Dans une étape ultérieure, vous allez augmenter le numéro de version en ajoutant un « a » à la chaîne de version.
Pour arrêter et supprimer le conteneur, exécutez la commande suivante :
docker stop myapp
Répertorier les builds
Répertoriez ensuite les exécutions de tâche effectuées par ACR Tasks pour votre registre à l’aide de la commande az acr task list-runs :
az acr task list-runs --registry $ACR_NAME --output table
Si vous avez terminé le didacticiel précédent (sans supprimer le registre), vous devez pouvoir observer une sortie similaire à ce qui suit. Prenez note du nombre d’exécutions de tâches et du dernier ID d’exécution afin de pouvoir comparer la sortie après avoir mis à jour l’image de base dans la section suivante.
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
Mettre à jour l’image de base
Ici, vous allez simuler un correctif d’infrastructure dans l’image de base. Modifiez Dockerfile-base et ajoutez un « a » après le numéro de version défini dans NODE_VERSION
:
ENV NODE_VERSION 15.2.1a
Exécutez une tâche rapide dans ACR Tasks pour générer l’image de base modifiée. Prenez note de l’ID d’exécution dans la sortie.
az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .
Lorsque la génération est terminée et qu’ACR Tasks a envoyé la nouvelle image de base dans le registre, il déclenche une génération de l’image de l’application. Quelques minutes peuvent être nécessaires à la tâche créée précédemment pour déclencher la génération d’image de l’application, car elle doit détecter l’image de base qui vient d’être générée et envoyée.
Répertorier le build mis à jour
Maintenant que vous avez mis à jour l’image de base, répertoriez à nouveau vos exécutions de tâches pour les comparer à la liste précédente. Si dans un premier temps, la sortie ne diffère pas, exécutez régulièrement la commande pour afficher la nouvelle exécution de tâche dans la liste.
az acr task list-runs --registry $ACR_NAME --output table
Le résultat ressemble à ce qui suit. Le DÉCLENCHEUR de la dernière génération exécutée doit être « Mise à jour de l’image », ce qui indique que la tâche a été lancée par la tâche rapide de l’image 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
Si vous souhaitez effectuer l’étape facultative suivante qui est d’exécuter le conteneur nouvellement généré pour voir le numéro de version mis à jour, prenez note de la valeur ID D’EXÉCUTION de la génération déclenchée par la mise à jour de l’image (dans la sortie précédente, il s’agit de « ca13 »).
Facultatif : Exécuter l’image qui vient d’être générée
Si vous travaillez localement (pas dans Cloud Shell) et si vous avez installé Docker, exécutez la nouvelle image de l’application une fois sa génération terminée. Remplacez <run-id>
par l’ID D’EXÉCUTION obtenu à l’étape précédente. Si vous utilisez Cloud Shell, ignorez cette section (Cloud Shell ne prend pas en charge docker run
).
docker run -d -p 8081:80 --name updatedapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>
Accédez à http://localhost:8081 dans le navigateur ; vous devez voir le numéro de version Node.js mis à jour (avec le « a ») affiché dans la page web :
Il est important de noter que si vous avez mis à jour votre image de base avec un nouveau numéro de version, l’image d’application générée en dernier affiche la nouvelle version. ACR Tasks a choisi la modification que vous avez apportée à l’image de base et régénéré automatiquement l’image de l’application.
Pour arrêter et supprimer le conteneur, exécutez la commande suivante :
docker stop updatedapp
Étapes suivantes
Dans ce didacticiel, vous avez découvert comment utiliser une tâche pour déclencher automatiquement la génération des images de conteneur lorsqu’une image de base a été mise à jour. À présent, passez au tutoriel suivant pour découvrir comment déclencher des tâches selon une planification définie.