Tutorial: Automatización de compilaciones de imágenes de contenedor al actualizarse una imagen base en una instancia de Azure Container RegistryTutorial: Automate container image builds when a base image is updated in an Azure container registry

ACR Tasks admite las compilaciones automatizadas de imágenes de contenedor cuando se actualiza una imagen de base del contenedor, como cuando se revisa el sistema operativo o el marco de trabajo de la aplicación de una de las imágenes de base.ACR Tasks supports automated container image builds when a container's base image is updated, such as when you patch the OS or application framework in one of your base images.

En este tutorial aprenderá a crear una tarea en ACR que desencadene una compilación en la nube cuando se inserte una imagen de base de contenedor en el mismo registro.In this tutorial, you learn how to create an ACR task that triggers a build in the cloud when a container's base image is pushed to the same registry. También puede probar un tutorial para crear una tarea en ACR que desencadene una compilación de imagen cuando se inserte una imagen de base en otro registro de contenedor de Azure.You can also try a tutorial to create an ACR task that triggers an image build when a base image is pushed to another Azure container registry.

En este tutorial, aprenderá a:In this tutorial:

  • Compilación de la imagen baseBuild the base image
  • Creación de una imagen de aplicación en el mismo registro para realizar el seguimiento de la imagen de baseCreate an application image in the same registry to track the base image
  • Actualización de la imagen base para que desencadene una tarea de imagen de aplicaciónUpdate the base image to trigger an application image task
  • Mostrar la tarea desencadenadaDisplay the triggered task
  • Comprobación de la imagen de aplicación actualizadaVerify updated application image

Uso de Azure Cloud ShellUse Azure Cloud Shell

En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Puede usar Bash o PowerShell con Cloud Shell para trabajar con los servicios de Azure.You can use either Bash or PowerShell with Cloud Shell to work with Azure services. Puede usar los comandos preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.You can use the Cloud Shell preinstalled commands to run the code in this article without having to install anything on your local environment.

Para iniciar Azure Cloud Shell:To start Azure Cloud Shell:

OpciónOption Ejemplo o vínculoExample/Link
Seleccione Pruébelo en la esquina superior derecha de un bloque de código.Select Try It in the upper-right corner of a code block. Solo con seleccionar Pruébelo no se copia automáticamente el código en Cloud Shell.Selecting Try It doesn't automatically copy the code to Cloud Shell. Ejemplo de Probarlo para Azure Cloud Shell
Vaya a https://shell.azure.com o seleccione el botón Iniciar Cloud Shell para abrir Cloud Shell en el explorador.Go to https://shell.azure.com, or select the Launch Cloud Shell button to open Cloud Shell in your browser. Iniciar Cloud Shell en una nueva ventanaLaunch Cloud Shell in a new window
Seleccione el botón Cloud Shell en la barra de menús de la esquina superior derecha de Azure Portal.Select the Cloud Shell button on the menu bar at the upper right in the Azure portal. Botón Cloud Shell en Azure Portal

Para ejecutar el código de este artículo en Azure Cloud Shell:To run the code in this article in Azure Cloud Shell:

  1. Inicie Cloud Shell.Start Cloud Shell.

  2. Seleccione el botón Copiar de un bloque de código para copiar el código.Select the Copy button on a code block to copy the code.

  3. Pegue el código en la sesión de Cloud Shell. Para ello, seleccione Ctrl+Mayús+V en Windows y Linux, o bien seleccione Cmd+Mayús+V en macOS.Paste the code into the Cloud Shell session by selecting Ctrl+Shift+V on Windows and Linux or by selecting Cmd+Shift+V on macOS.

  4. Seleccione Entrar para ejecutar el código.Select Enter to run the code.

Si quiere usar la CLI de Azure de forma local, debe tener la versión 2.0.46 de la CLI de Azure u otra posterior instalada.If you'd like to use the Azure CLI locally, you must have the Azure CLI version 2.0.46 or later installed. Ejecute az --version para encontrar la versión.Run az --version to find the version. Si necesita instalarla o actualizarla, consulte Instalación de la CLI de Azure.If you need to install or upgrade the CLI, see Install Azure CLI.

PrerrequisitosPrerequisites

Complete los tutoriales anteriores.Complete the previous tutorials

En este tutorial se da por supuesto que ya ha completado los pasos de los dos primeros tutoriales de la serie, en los cuales puede realizar la:This tutorial assumes you've already completed the steps in the first two tutorials in the series, in which you:

  • Creación de una instancia de Azure Container RegistryCreate Azure container registry
  • Bifurcación del repositorio de ejemploFork sample repository
  • Clonación del repositorio de ejemploClone sample repository
  • Creación de un token de acceso personal de GitHubCreate GitHub personal access token

Si aún no lo ha hecho, complete los primeros tutoriales antes de continuar:If you haven't already done so, complete the following tutorials before proceeding:

Compilación de imágenes de contenedor en la nube con Azure Container Registry TasksBuild container images in the cloud with Azure Container Registry Tasks

Automatización de compilaciones de imágenes de contenedor con Azure Container Registry TasksAutomate container image builds with Azure Container Registry Tasks

Configuración del entornoConfigure the environment

Rellene estas variables de entorno de shell con valores adecuados para el entorno.Populate these shell environment variables with values appropriate for your environment. Este paso no es estrictamente necesario, pero hace que la ejecución de los comandos de varias líneas de la CLI de Azure en este tutorial sea un poco más fácil.This step isn't strictly required, but makes executing the multiline Azure CLI commands in this tutorial a bit easier. Si no rellena estas variables de entorno, debe reemplazar manualmente cada valor siempre que aparezca en los comandos de ejemplo.If you don't populate these environment variables, you must manually replace each value wherever it appears in the example commands.

Insertar inicioEmbed launch

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

Escenario de actualización de imagen baseBase image update scenario

Este tutorial le guía por un escenario de actualización de imagen de base en el que una imagen de base y una imagen de aplicación se mantienen en un solo registro.This tutorial walks you through a base image update scenario in which a base image and an application image are maintained in a single registry.

El código de ejemplo incluye dos archivos Dockerfile: una imagen de aplicación y una imagen especificada como su base.The code sample includes two Dockerfiles: an application image, and an image it specifies as its base. En las secciones siguientes creará una tarea de ACR Tasks que desencadena automáticamente una compilación de la imagen de aplicación cuando se inserta una nueva versión de la imagen base en el mismo registro de contenedor.In the following sections, you create an ACR task that automatically triggers a build of the application image when a new version of the base image is pushed to the same container registry.

  • Dockerfile-app: una pequeña aplicación web de Node.js que representa una página web estática que muestra la versión de Node.js en la que se basa.Dockerfile-app: A small Node.js web application that renders a static web page displaying the Node.js version on which it's based. Se simula la cadena de versión: se muestra el contenido de una variable de entorno, NODE_VERSION, que se definió en la imagen base.The version string is simulated: it displays the contents of an environment variable, NODE_VERSION, that's defined in the base image.

  • Dockerfile-base: la imagen que Dockerfile-app especifica como su base.Dockerfile-base: The image that Dockerfile-app specifies as its base. Está basada en una imagen de Node e incluye la variable de entorno NODE_VERSION.It is itself based on a Node image, and includes the NODE_VERSION environment variable.

En las secciones siguientes, va a crear una tarea, actualizar el valor NODE_VERSION en el archivo de Docker de la imagen base y, finalmente, a usar ACR Tasks para compilar la imagen base.In the following sections, you create a task, update the NODE_VERSION value in the base image Dockerfile, then use ACR Tasks to build the base image. Cuando ACR Tasks inserta la nueva imagen base en el registro, este desencadena automáticamente una compilación de la imagen de aplicación.When the ACR task pushes the new base image to your registry, it automatically triggers a build of the application image. Si lo desea, puede ejecutar la imagen de contenedor de la aplicación localmente para ver las diferentes cadenas de versión de las imágenes compiladas.Optionally, you run the application container image locally to see the different version strings in the built images.

En este tutorial, ACR Tasks compila e inserta una imagen de contenedor de aplicación especificada en un archivo Dockerfile.In this tutorial, your ACR task builds and pushes an application container image specified in a Dockerfile. Azure Container Registry Tasks también puede ejecutar tareas de varios pasos mediante un archivo YAML que define los pasos para compilar, insertar y, opcionalmente, probar varios contenedores.ACR Tasks can also run multi-step tasks, using a YAML file to define steps to build, push, and optionally test multiple containers.

Compilación de la imagen baseBuild the base image

Empiece por compilar la imagen de base con una tarea rápida de ACR Tasks mediante az acr build.Start by building the base image with an ACR Tasks quick task, using az acr build. Como se ha descrito en el primer tutorial de la serie, este proceso no solo sirve para compilar la imagen, si no también para insertarla en el registro de contenedor si la compilación es correcta.As discussed in the first tutorial in the series, this process not only builds the image, but pushes it to your container registry if the build is successful.

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

Crea una tarea.Create a task

A continuación, cree una tarea con az acr task create:Next, create a task with az acr task create:

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

Esta tarea es similar a la creada en el tutorial anterior.This task is similar to the task created in the previous tutorial. Indica a ACR Tasks que desencadene una compilación de la imagen cuando se inserten confirmaciones en el repositorio especificado por --context.It instructs ACR Tasks to trigger an image build when commits are pushed to the repository specified by --context. Mientras que el archivo de Dockerfile que se usa para compilar la imagen en el tutorial anterior especifica una imagen base pública (FROM node:9-alpine), el archivo Dockerfile en esta tarea (Dockerfile-app) especifica una imagen base en el mismo registro:While the Dockerfile used to build the image in the previous tutorial specifies a public base image (FROM node:9-alpine), the Dockerfile in this task, Dockerfile-app, specifies a base image in the same registry:

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

Esta configuración facilita simular una revisión del marco de trabajo en la imagen base más adelante en este tutorial.This configuration makes it easy to simulate a framework patch in the base image later in this tutorial.

Compilación del contenedor de aplicaciónBuild the application container

Use az acr task run para desencadenar manualmente la tarea y compilar la imagen de aplicación.Use az acr task run to manually trigger the task and build the application image. Este paso es necesario para que la tarea supervise la dependencia de la imagen de la aplicación en la imagen de base.This step is needed so that the task tracks the application image's dependency on the base image.

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

Una vez finalizada la tarea, tome nota del identificador de ejecución (por ejemplo, "da6") si desea completar el siguiente paso opcional.Once the task has completed, take note of the Run ID (for example, "da6") if you wish to complete the following optional step.

Opcional: Ejecutar contenedor de aplicación localmenteOptional: Run application container locally

Si está trabajando de forma local (no en Cloud Shell), y tiene Docker instalado, ejecute el contenedor para ver la aplicación representada en un explorador web antes de recompilar su imagen base.If you're working locally (not in the Cloud Shell), and you have Docker installed, run the container to see the application rendered in a web browser before you rebuild its base image. Si va a usar Cloud Shell, omita esta sección (Cloud Shell no admite az acr login ni docker run).If you're using the Cloud Shell, skip this section (Cloud Shell does not support az acr login or docker run).

En primer lugar, autentíquese en el registro de contenedor con az acr login:First, authenticate to your container registry with az acr login:

az acr login --name $ACR_NAME

Ahora, ejecute el contenedor localmente con docker run.Now, run the container locally with docker run. Reemplace <run-id> por el identificador de ejecución que se encuentra en la salida del paso anterior (por ejemplo, "da6").Replace <run-id> with the Run ID found in the output from the previous step (for example, "da6"). En este ejemplo el contenedor se denomina myapp e incluye el parámetro --rm para quitar el contenedor cuando lo detenga.This example names the container myapp and includes the --rm parameter to remove the container when you stop it.

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

Vaya a http://localhost:8080 en el explorador, allí verá el número de versión de Node.js representado en la página web de manera parecida a la siguiente.Navigate to http://localhost:8080 in your browser, and you should see the Node.js version number rendered in the web page, similar to the following. En un paso posterior, cambiará la versión agregando una "a" a la cadena de versión.In a later step, you bump the version by adding an "a" to the version string.

Captura de pantalla de una aplicación de ejemplo representada en el explorador

Ejecute el siguiente comando para detener y eliminar el contenedor:To stop and remove the container, run the following command:

docker stop myapp

Lista de las compilacionesList the builds

A continuación, muestre las tareas que ACR Tasks ha completado para el registro mediante el comando az acr task list-runs:Next, list the task runs that ACR Tasks has completed for your registry using the az acr task list-runs command:

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

Si completó el tutorial anterior (y no eliminó el registro), debería ver una salida parecida a la siguiente.If you completed the previous tutorial (and didn't delete the registry), you should see output similar to the following. Tome nota del número de ejecuciones de tareas y del identificador de ejecución más reciente, para que pueda comparar la salida después de actualizar la imagen base en la sección siguiente.Take note of the number of task runs, and the latest RUN ID, so you can compare the output after you update the base image in the next section.

RUN ID    TASK            PLATFORM    STATUS     TRIGGER     STARTED               DURATION
--------  --------------  ----------  ---------  ----------  --------------------  ----------
da6       taskhelloworld  Linux       Succeeded  Manual      2018-09-17T23:07:22Z  00:00:38
da5                       Linux       Succeeded  Manual      2018-09-17T23:06:33Z  00:00:31
da4       taskhelloworld  Linux       Succeeded  Git Commit  2018-09-17T23:03:45Z  00:00:44
da3       taskhelloworld  Linux       Succeeded  Manual      2018-09-17T22:55:35Z  00:00:35
da2       taskhelloworld  Linux       Succeeded  Manual      2018-09-17T22:50:59Z  00:00:32
da1                       Linux       Succeeded  Manual      2018-09-17T22:29:59Z  00:00:57

Actualización de la imagen baseUpdate the base image

Aquí puede simular una revisión de la plataforma en la imagen base.Here you simulate a framework patch in the base image. Edite Dockerfile-base y agregue una "a" después del número de versión definido en NODE_VERSION:Edit Dockerfile-base, and add an "a" after the version number defined in NODE_VERSION:

ENV NODE_VERSION 9.11.2a

Ejecute una tarea rápida para compilar la imagen base modificada.Run a quick task to build the modified base image. Tome nota del identificador de ejecución de la salida.Take note of the Run ID in the output.

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

Una vez que haya finalizado la compilación y que ACR Tasks haya insertado la nueva imagen base en el registro, este desencadena una compilación de la imagen de aplicación.Once the build is complete and the ACR task has pushed the new base image to your registry, it triggers a build of the application image. Es posible que la tarea que creó anteriormente tarde unos instantes en desencadenar la compilación de la imagen de aplicación, ya que debe detectar la imagen base recién compilada e insertada.It may take few moments for the task you created earlier to trigger the application image build, as it must detect the newly built and pushed base image.

Lista de compilaciones actualizadasList updated build

Ahora que ha actualizado la imagen base, vuelva a enumerar las ejecuciones de tareas para compararlas con la lista anterior.Now that you've updated the base image, list your task runs again to compare to the earlier list. Si al principio la salida no es diferente, ejecute periódicamente el comando hasta ver cómo aparece la nueva ejecución de tarea en la lista.If at first the output doesn't differ, periodically run the command to see the new task run appear in the list.

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

La salida es similar a la siguiente.Output is similar to the following. El DESENCADENADOR de la última compilación ejecutada debe ser "Image Update", lo cual indica que la tarea la inició la tarea rápida de la imagen base.The TRIGGER for the last-executed build should be "Image Update", indicating that the task was kicked off by your quick task of the base image.

Run ID    TASK            PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
da8       taskhelloworld  Linux       Succeeded  Image Update  2018-09-17T23:11:50Z  00:00:33
da7                       Linux       Succeeded  Manual        2018-09-17T23:11:27Z  00:00:35
da6       taskhelloworld  Linux       Succeeded  Manual        2018-09-17T23:07:22Z  00:00:38
da5                       Linux       Succeeded  Manual        2018-09-17T23:06:33Z  00:00:31
da4       taskhelloworld  Linux       Succeeded  Git Commit    2018-09-17T23:03:45Z  00:00:44
da3       taskhelloworld  Linux       Succeeded  Manual        2018-09-17T22:55:35Z  00:00:35
da2       taskhelloworld  Linux       Succeeded  Manual        2018-09-17T22:50:59Z  00:00:32
da1                       Linux       Succeeded  Manual        2018-09-17T22:29:59Z  00:00:57

Si quiere realizar el siguiente paso opcional y ejecutar el contenedor recién compilado para ver el número de versión actualizado, anote el valor del identificador de ejecución de la compilación que desencadenó "Image Update" (en la salida anterior es "da8").If you'd like to perform the following optional step of running the newly built container to see the updated version number, take note of the RUN ID value for the Image Update-triggered build (in the preceding output, it's "da8").

Opcional: Ejecución de la imagen recién compiladaOptional: Run newly built image

Si está trabajando de forma local (no en Cloud Shell), y tiene Docker instalado, ejecute la nueva imagen de aplicación después de terminar su compilación.If you're working locally (not in the Cloud Shell), and you have Docker installed, run the new application image once its build has completed. Sustituya <run-id> por el identificador de ejecución que obtuvo en el paso anterior.Replace <run-id> with the RUN ID you obtained in the previous step. Si va a usar Cloud Shell, omita esta sección (Cloud Shell no admite docker run).If you're using the Cloud Shell, skip this section (Cloud Shell does not support docker run).

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

Vaya a http://localhost:8081 en el explorador, allí verá el número de versión de Node.js actualizado (con la "a") en la página web:Navigate to http://localhost:8081 in your browser, and you should see the updated Node.js version number (with the "a") in the web page:

Captura de pantalla de una aplicación de ejemplo representada en el explorador

Es importante observar que ha actualizado la imagen base con un nuevo número de versión, pero que también la imagen de aplicación recién compilada muestra la nueva versión.What's important to note is that you updated your base image with a new version number, but the last-built application image displays the new version. ACR Tasks recopiló el cambio en la imagen base y recompiló automáticamente la imagen de aplicación.ACR Tasks picked up your change to the base image, and rebuilt your application image automatically.

Ejecute el siguiente comando para detener y eliminar el contenedor:To stop and remove the container, run the following command:

docker stop updatedapp

Pasos siguientesNext steps

En este tutorial, ha aprendido a usar una tarea para desencadenar automáticamente compilaciones de imágenes de contenedor cuando se actualiza la imagen base de la imagen.In this tutorial, you learned how to use a task to automatically trigger container image builds when the image's base image has been updated. Ahora, pase al siguiente tutorial para aprender a desencadenar tareas según una programación definida.Now, move on to the next tutorial to learn how to trigger tasks on a defined schedule.