Cómo usar el comando docker buildx debug build para construir e inspeccionar imágenes

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás a utilizar eficazmente el comando docker buildx debug build para construir e inspeccionar imágenes Docker. Comenzarás construyendo una imagen simple con configuraciones predeterminadas utilizando un Dockerfile.

Sobre esta base, explorarás escenarios de construcción más avanzados, incluyendo la incorporación de argumentos de construcción (build arguments) y etiquetas (labels) en tus imágenes. También aprenderás a dirigirte a plataformas específicas durante el proceso de construcción y a exportar la imagen resultante a un archivo. Finalmente, el laboratorio cubrirá técnicas para controlar la caché de construcción y exponer secretos de manera segura durante el proceso, brindando una comprensión integral de las capacidades del comando docker buildx debug build.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/ImageOperationsGroup -.-> docker/save("Save Image") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555047{{"Cómo usar el comando docker buildx debug build para construir e inspeccionar imágenes"}} docker/inspect -.-> lab-555047{{"Cómo usar el comando docker buildx debug build para construir e inspeccionar imágenes"}} docker/images -.-> lab-555047{{"Cómo usar el comando docker buildx debug build para construir e inspeccionar imágenes"}} docker/save -.-> lab-555047{{"Cómo usar el comando docker buildx debug build para construir e inspeccionar imágenes"}} docker/build -.-> lab-555047{{"Cómo usar el comando docker buildx debug build para construir e inspeccionar imágenes"}} end

Construir una imagen simple con configuraciones predeterminadas

En este paso, aprenderás cómo construir una imagen Docker simple utilizando un Dockerfile. Un Dockerfile es un documento de texto que contiene todos los comandos que un usuario podría ejecutar en la línea de comandos para ensamblar una imagen. Docker puede construir imágenes automáticamente leyendo las instrucciones de un Dockerfile.

Primero, navega al directorio ~/project, que es tu directorio de trabajo para este laboratorio.

cd ~/project

Ahora, creemos un Dockerfile simple. Crearemos un archivo llamado Dockerfile en el directorio ~/project. Este Dockerfile definirá los pasos para crear una imagen basada en la imagen base ubuntu e instalar el paquete cowsay.

Usa el editor nano para crear y editar el Dockerfile:

nano Dockerfile

Agrega el siguiente contenido al Dockerfile:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "Hello, Docker!"]

Analicemos este Dockerfile:

  • FROM ubuntu:latest: Esta instrucción especifica la imagen base para nuestra nueva imagen. Estamos usando la última versión de la imagen oficial de Ubuntu de Docker Hub.
  • RUN apt-get update && apt-get install -y cowsay: Esta instrucción ejecuta comandos en una nueva capa sobre la imagen actual y guarda los resultados. Aquí, actualizamos la lista de paquetes e instalamos el paquete cowsay. La bandera -y responde automáticamente "sí" a las preguntas.
  • CMD ["cowsay", "Hello, Docker!"]: Esta instrucción proporciona comandos predeterminados para un contenedor en ejecución. Cuando se inicia un contenedor desde esta imagen sin especificar un comando, ejecutará cowsay "Hello, Docker!".

Guarda el archivo presionando Ctrl + X, luego Y, y Enter.

Ahora que tenemos nuestro Dockerfile, podemos construir la imagen. Usa el comando docker build. El . al final del comando le indica a Docker que busque el Dockerfile en el directorio actual (~/project). También etiquetaremos la imagen con un nombre, por ejemplo, my-cowsay-image.

docker build -t my-cowsay-image .

Este comando ejecutará las instrucciones en el Dockerfile paso a paso. Verás una salida que indica cada paso procesado, incluyendo la descarga de la imagen base (si no está presente) y la instalación de cowsay.

Una vez que se complete el proceso de construcción, puedes verificar que la imagen se creó correctamente listando las imágenes disponibles con el comando docker images:

docker images

Deberías ver my-cowsay-image en la salida.

Finalmente, ejecutemos un contenedor desde la imagen que acabamos de construir para ver si funciona como se espera.

docker run my-cowsay-image

Este comando creará e iniciará un nuevo contenedor basado en my-cowsay-image. Como definimos una instrucción CMD en nuestro Dockerfile, el contenedor ejecutará automáticamente cowsay "Hello, Docker!", y deberías ver la vaca diciendo "Hello, Docker!" en la salida de tu terminal.

Construir una imagen con argumentos de construcción y etiquetas

En este paso, aprenderás a utilizar argumentos de construcción (ARG) y etiquetas (LABEL) en tu Dockerfile. Los argumentos de construcción te permiten pasar variables al proceso de build, haciendo tu Dockerfile más flexible. Las etiquetas son pares clave-valor que puedes adjuntar a una imagen para agregar metadatos.

Primero, asegúrate de estar en el directorio ~/project:

cd ~/project

Ahora, modifiquemos el Dockerfile que creamos en el paso anterior. Añadiremos un argumento de construcción para personalizar el mensaje mostrado por cowsay y agregaremos una etiqueta a la imagen.

Abre el Dockerfile para editarlo:

nano Dockerfile

Modifica el contenido para incluir las instrucciones ARG y LABEL:

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
CMD ["cowsay", "$MESSAGE"]

Analicemos los cambios:

  • ARG MESSAGE="Hello, Docker!": Esta instrucción define un argumento de construcción llamado MESSAGE con un valor predeterminado de "Hello, Docker!". Este valor puede sobrescribirse durante el proceso de build.
  • LABEL maintainer="Your Name <[email protected]>": Esta instrucción añade una etiqueta a la imagen. Las etiquetas son útiles para agregar información como el mantenedor, versión u otros metadatos relevantes.
  • CMD ["cowsay", "$MESSAGE"]: Hemos modificado la instrucción CMD para usar el valor del argumento MESSAGE.

Guarda el Dockerfile modificado presionando Ctrl + X, luego Y, y Enter.

Ahora, construyamos la imagen nuevamente, pero esta vez pasaremos un valor para el argumento MESSAGE usando la bandera --build-arg. También le asignaremos un nuevo tag, my-custom-cowsay-image.

docker build --build-arg MESSAGE="Building with arguments!" -t my-custom-cowsay-image .

Observa la salida durante el proceso de build. Deberías ver que la instrucción ARG se procesa y el valor de MESSAGE se establece en "Building with arguments!".

Una vez completado el build, ejecutemos un contenedor desde esta nueva imagen:

docker run my-custom-cowsay-image

Esta vez, el contenedor debería mostrar el mensaje personalizado "Building with arguments!".

También puedes inspeccionar la imagen para ver las etiquetas añadidas. Usa el comando docker inspect seguido del nombre de la imagen:

docker inspect my-custom-cowsay-image

En la salida, busca la sección "Labels". Deberías encontrar la etiqueta maintainer con el valor que especificaste en el Dockerfile.

Construir una imagen para una plataforma específica y exportarla a un archivo

En este paso, aprenderás cómo construir una imagen Docker para una plataforma específica y cómo exportar la imagen construida a un archivo. Construir para diferentes plataformas es útil cuando necesitas desplegar tu aplicación en sistemas con distintas arquitecturas (ej. ARM vs x86). Exportar a un archivo te permite guardar la imagen como un archivo tar, que puede transferirse fácilmente y cargarse en otro entorno Docker.

Primero, asegúrate de estar en el directorio ~/project:

cd ~/project

Utilizaremos el mismo Dockerfile del paso anterior. Puedes ver su contenido con el comando cat:

cat Dockerfile

La salida debería ser:

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
CMD ["cowsay", "$MESSAGE"]

Ahora, construyamos la imagen específicamente para la plataforma linux/arm64. Usaremos la bandera --platform. Nota que construir para una plataforma diferente requiere Docker Buildx, que normalmente viene incluido en instalaciones recientes de Docker.

docker build --platform linux/arm64 -t my-arm64-cowsay-image .

Este comando construirá la imagen para arquitectura ARM64. Verás una salida similar a builds anteriores, pero el proceso está dirigido a una arquitectura diferente.

Una vez completado el build, puedes listar tus imágenes para ver la nueva imagen creada. Nota que la columna ARCHITECTURE mostrará arm64 para esta imagen.

docker images

A continuación, exportemos esta imagen a un archivo tar. Esto es útil para guardar y compartir imágenes sin usar un registry. Usaremos la bandera --output con la opción type=tar.

docker build --platform linux/arm64 -t my-arm64-cowsay-image . --output type=tar,dest=my-arm64-cowsay-image.tar

Este comando construye la imagen nuevamente (potencialmente usando la caché de build) y luego la guarda como un archivo tar llamado my-arm64-cowsay-image.tar en el directorio ~/project.

Puedes verificar que el archivo tar fue creado usando el comando ls:

ls -lh my-arm64-cowsay-image.tar

Deberías ver el archivo listado con su tamaño. Este archivo tar contiene todas las capas de my-arm64-cowsay-image. Podrías transferir este archivo a otra máquina y cargarlo usando docker load -i my-arm64-cowsay-image.tar.

Construir una imagen con control de caché y manejo de secretos

En este paso, aprenderás sobre el control de la caché de construcción de Docker y cómo manejar secretos durante el proceso de build usando el tipo de montaje secret de BuildKit. La caché de build puede acelerar significativamente las construcciones, pero a veces necesitas desactivarla. Manejar secretos de forma segura es crucial para evitar incrustar información sensible en las capas de tu imagen.

Primero, asegúrate de estar en el directorio ~/project:

cd ~/project

Modifiquemos el Dockerfile para incluir un paso donde podamos controlar el caché y demostrar el manejo de secretos. Añadiremos un paso simple de creación de archivo y un paso hipotético que usaría un secreto.

Abre el Dockerfile para editar:

nano Dockerfile

Modifica el contenido para incluir un comando RUN que crea un archivo con marca de tiempo y un marcador de posición para usar un secreto:

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
RUN echo "Build time: $(date)" > /app/build_info.txt
## Este es un marcador de posición para un comando que usaría un secreto
## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt
CMD ["cowsay", "$MESSAGE"]

Añadimos RUN echo "Build time: $(date)" > /app/build_info.txt. Este comando crea un archivo /app/build_info.txt que contiene la marca de tiempo cuando se construyó esta capa. Por defecto, Docker almacena en caché las capas. Si construyes la imagen múltiples veces sin cambiar las instrucciones anteriores a este comando RUN, esta capa podría servirse desde la caché y la marca de tiempo no se actualizaría.

Guarda el Dockerfile modificado presionando Ctrl + X, luego Y, y Enter.

Ahora, construyamos la imagen con un nuevo tag, my-cached-image.

docker build -t my-cached-image .

Observa la salida. Si has construido la imagen recientemente, podrías ver ---> Using cache para algunos pasos.

Para demostrar el control de caché, construyamos la imagen nuevamente, pero esta vez desactivaremos la caché para todo el build usando la bandera --no-cache.

docker build --no-cache -t my-no-cache-image .

Verás que Docker reconstruye cada capa, incluso si las instrucciones no han cambiado. Esto es útil cuando quieres asegurarte de que todas las dependencias se obtienen frescas o cuando un build anterior falló de manera que corrompió la caché.

Ahora, hablemos del manejo de secretos. La línea comentada ## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt demuestra cómo usarías un secreto con BuildKit. Para usar esto, necesitarías activar BuildKit (que normalmente está activado por defecto en versiones recientes de Docker) y proporcionar el secreto durante el build usando la bandera --secret.

Por ejemplo, si tuvieras un archivo llamado mysecret.txt conteniendo tu secreto, construirías así (este comando no funcionará tal cual porque no tenemos un archivo mysecret.txt y la línea está comentada, pero muestra la sintaxis):

## docker build --secret id=mysecret,src=mysecret.txt -t my-secret-image .

La instrucción RUN --mount=type=secret,id=mysecret hace que el contenido del secreto esté disponible en /run/secrets/mysecret solo durante el paso de build. El secreto no se incluye en las capas finales de la imagen. Esta es la forma segura de manejar información sensible como claves API o contraseñas durante builds.

Como no tenemos un archivo secreto y la línea está comentada, no ejecutaremos el comando de build relacionado con secretos. Sin embargo, entender los conceptos de --no-cache y el tipo de montaje secret es importante para controlar tus builds y manejar datos sensibles.

Resumen

En este laboratorio, aprendiste los fundamentos para construir imágenes Docker usando un Dockerfile. Comenzaste creando un Dockerfile simple basado en Ubuntu, instalando un paquete y definiendo un comando predeterminado. Esto te introdujo a las instrucciones básicas FROM, RUN y CMD, y cómo construir una imagen usando docker build con un tag.

Sobre esta base, exploraste técnicas más avanzadas de construcción de imágenes. Aprendiste cómo incorporar argumentos de build (build arguments) y etiquetas (labels) en tu Dockerfile para personalizar el proceso de construcción y añadir metadatos a la imagen. También practicaste la construcción de imágenes para plataformas específicas y la exportación de la imagen resultante a un archivo, demostrando cómo controlar la salida del build. Finalmente, profundizaste en el manejo de la caché de construcción y el tratamiento seguro de secretos durante el proceso de build, destacando las mejores prácticas para una creación de imágenes eficiente y segura.