Generar las imágenes de Docker desde Azure Container Registry

Hasta ahora, cada vez que quieres generar una imagen de Docker para tu aplicación necesitas lanzar el comando docker build. Además, necesitas de una máquina local que tenga instalado el motor de Docker, que es el que realiza dicha tarea. Una vez hecho esto, también debes usar docker push para subir tu imagen a tu repositorio público o privado, utilizando antes docker tag para su etiquetado previo. Hace unas semanas ya te conté que Microsoft Azure tiene un repositorio privado como servicio llamado Azure Container Registry. Lo que hoy te quiero contar es cómo ahorrarte estos tres comandos, utilizando este mismo servicio para generar tus imágenes desde la nube.

Crea una cuenta de Azure Container Registry

Si todavía no lo tienes, necesitas crear un servicio del tipo Azure Container Registry. Puedes crearlo siguiendo los pasos de este artículo o bien lanzando el siguiente comando:

#Bash variables
ACR_NAME="<YOUR_AZURE_CONTAINER_REGISTRY_NAME>"
RESOURCE_GROUP=$ACR_NAME
Location="North Europe"

#PowerShell variables
$ACR_NAME="<YOUR_AZURE_CONTAINER_REGISTRY_NAME>"
$RESOURCE_GROUP=$ACR_NAME
$Location="North Europe"

#Login
az login

#Select your subscription account
az account set -s "<YOUR_AZURE_SUBSCRIPTION_NAME>"

az group create --resource-group $RESOURCE_GROUP --location $Location
az acr create --resource-group $RESOURCE_GROUP --name $ACR_NAME --sku Standard --location $Location

Lanzar tareas a Azure Container Registry

Una vez que tienes tu repositorio privado en Azure, ya puedes mandarle tareas 🙂 La forma más rápida de hacerlo es ubicándote en el directorio local donde está tu código fuente y, en lugar de lanzar docker build, ejecuta el siguiente comando:

az acr build --registry $ACR_NAME --image 911backend .

Este comenzará el proceso de build, pero en la nube. Lo bueno de este proceso es que además, de manera automática, genera el tag necesario para poder subirlo al repositorio, una vez finalice la tarea.
Además, habrás visto que durante la ejecución del comando puedes ver los mensajes de salida del mismo. Si quieres verlo una vez que haya finalizado, accede al apartado Repositories de Azure Container Registry, selecciona la imagen que acabas de generar, el tag asociado y haz clic sobre el enlace que aparece en Run ID para ver los logs.

Azure Container Registry - Repositories - Run Logs
Azure Container Registry – Repositories – Run Logs

Automatizar el proceso de generación de imágenes

Si quieres automatizar este proceso puedes ligarlo a tu código fuente en GitHub o Azure DevOps, por ahora. En este ejemplo voy a mostrarte cómo hacerlo con mi código fuente en un repositorio privado de GitHub.

Lo primero que necesitas es un Personal Access Token (PAT) con los permisos repo:status y public_repo. Para crearlo puedes hacerlo a través de este enlace: https://github.com/settings/tokens/new

GitHub – Crear un Personal Access Token (PAT)

Haz clic en el botón de Generate y copia el token. En el caso de tratarse de un repositorio privado, deberás modificar el scope directamente a repo.

Para crear la tarea utiliza el siguiente comando:

#Create an azure-cli container
docker run -it --rm microsoft/azure-cli sh

#Login
az login

#Select your subscription account
az account set -s "<YOUR_AZURE_SUBSCRIPTION_NAME>"

#Bash variables
ACR_NAME="<YOUR_AZURE_CONTAINER_REGISTRY_NAME>"
GIT_USER="<YOUR_USER_NAME>"
GIT_PAT="<YOUR_GITHUN_PATH>"
REPO_URL="https://github.com/$GIT_USER/<YOUR_REPOSITORY>.git"
DOCKER_FILE_LOCATION="Dockerfile"

#Create a task to automate image builds
az acr task create --registry $ACR_NAME \
--name task911backend --image 911backend:{{.Run.ID}} \
--context $REPO_URL --file $DOCKER_FILE_LOCATION --git-access-token $GIT_PAT \
--branch master 

Las primeras líneas del script son para utilizar un contenedor de usar y tirar de Azure CLI. Una vez iniciada la sesión en tu cuenta de Microsoft Azure, para crear una tarea necesitas el nombre de tu Azure Container Registry, tu usuario en GitHub, el PAT creado anteriormente, la URL donde se encuentra tu repositorio y la localización del archivo Dockerfile. En el caso de que se encuentre en la raíz del proyecto basta con poner Dockerfile. Ejecuta la creación de la tarea con todos los parámetros y obtendrás un json como confirmación de que la misma se ha creado satisfactoriamente.

Para comprobar que tu tarea se ejecutará correctamente cuando se realice un commit, puedes lanzarla manualmente a través de az acr task run.

#Execute the task manually
az acr task run --registry $ACR_NAME --name task911backend

También puedes ver el estado de las ejecuciones lanzadas hasta ahora:

#Lists builds
az acr task list-runs --registry $ACR_NAME --output table

¡Saludos!