Introducción
Docker Buildx extiende el comando estándar docker build con características mejoradas para crear imágenes de múltiples arquitecturas. Sin embargo, los usuarios a menudo se encuentran con el error "docker buildx build requires exactly 1 argument" (docker buildx build requiere exactamente 1 argumento) al trabajar con esta herramienta. Este tutorial completo le guiará a través de la comprensión de Docker Buildx, el diagnóstico de este error común y la implementación de soluciones efectivas.
Al final de este laboratorio, tendrá experiencia práctica en la configuración de Docker Buildx, la creación de imágenes Docker, la solución de problemas del error "requires exactly 1 argument" y la construcción de imágenes para múltiples arquitecturas. Estas habilidades son esenciales para el desarrollo y despliegue de aplicaciones modernizadas en contenedores.
Configuración de Docker Buildx
Docker Buildx viene preinstalado con Docker, pero necesita ser configurado correctamente antes de su uso. En este paso, verificaremos que Docker esté instalado, habilitaremos Docker Buildx y crearemos nuestra primera instancia de constructor (builder).
Verificación de la instalación de Docker
Primero, confirmemos que Docker está instalado y en ejecución en nuestro sistema:
docker --version
Debería ver una salida similar a:
Docker version 20.10.21, build baeda1f
Esto confirma que Docker está instalado y listo para usar.
Comprensión de Docker Buildx
Docker Buildx es un plugin de la interfaz de línea de comandos (CLI) que extiende la funcionalidad de Docker con BuildKit. Permite:
- Construir imágenes para múltiples plataformas (como AMD64, ARM64) simultáneamente
- Un almacenamiento en caché de capas (layer caching) más eficiente
- Un rendimiento de construcción mejorado
- Características de construcción avanzadas
Creación de un Constructor Docker Buildx
Creemos y usemos un nuevo constructor Docker Buildx:
docker buildx create --name mybuilder --use
La salida debería ser similar a:
mybuilder
Ahora, verifiquemos que nuestro constructor fue creado y está configurado como el predeterminado:
docker buildx ls
Debería ver una salida similar a:
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
mybuilder * docker-container
mybuilder0 unix:///var/run/docker.sock inactive
default docker
default default running linux/amd64, linux/386
El asterisco (*) junto a mybuilder indica que es el constructor actualmente activo.
Inspección del Constructor
Examinemos los detalles de nuestro constructor:
docker buildx inspect mybuilder
Esto le mostrará la configuración del constructor, incluyendo las plataformas soportadas y su estado actual.
Ahora que hemos configurado Docker Buildx con éxito, estamos listos para pasar a la creación de un Dockerfile para usar con nuestro constructor.
Creación de un Dockerfile Simple para Pruebas
Antes de usar Docker Buildx para construir imágenes, necesitamos crear un Dockerfile simple. Esto servirá como nuestro caso de prueba para comprender el error "requires exactly 1 argument" (requiere exactamente 1 argumento).
Comprensión de los Dockerfiles
Un Dockerfile es un documento de texto que contiene instrucciones para construir una imagen Docker. Automatiza el proceso de creación de contenedores con configuraciones específicas.
Creemos un directorio para nuestro proyecto:
mkdir -p ~/project/buildx-test
cd ~/project/buildx-test
Creación de un Dockerfile Básico
Ahora, creemos un Dockerfile simple usando el editor de texto nano:
nano Dockerfile
Copie y pegue el siguiente contenido en el Dockerfile:
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
curl \
nginx \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Presione Ctrl+O seguido de Enter para guardar, luego Ctrl+X para salir de nano.
Desglosemos este Dockerfile:
FROM ubuntu:22.04- Usa Ubuntu 22.04 como imagen baseRUN apt-get update...- Actualiza las listas de paquetes e instala curl y nginxEXPOSE 80- Indica que el contenedor escuchará en el puerto 80CMD ["nginx", "-g", "daemon off;"]- Ejecuta nginx en primer plano cuando el contenedor se inicia
Creación de un archivo .dockerignore
Un archivo .dockerignore ayuda a excluir archivos y directorios que no son necesarios en el contexto de construcción, haciendo que las construcciones sean más rápidas y eficientes:
nano .dockerignore
Agregue el siguiente contenido:
.git
.gitignore
*.md
Presione Ctrl+O seguido de Enter para guardar, luego Ctrl+X para salir de nano.
Verificación de la estructura del proyecto
Verifiquemos que nuestros archivos se hayan creado correctamente:
ls -la
Debería ver una salida similar a:
total 16
drwxrwxr-x 2 labex labex 4096 Jan 1 00:00 .
drwxr-xr-x 3 labex labex 4096 Jan 1 00:00 ..
-rw-rw-r-- 1 labex labex 21 Jan 1 00:00 .dockerignore
-rw-rw-r-- 1 labex labex 159 Jan 1 00:00 Dockerfile
Ahora que tenemos un Dockerfile básico, estamos listos para probar Docker Buildx y explorar el error "requires exactly 1 argument" en el siguiente paso.
Comprensión y Resolución del Error "Requires Exactly 1 Argument" (Requiere Exactamente 1 Argumento)
En este paso, provocaremos deliberadamente el error "requires exactly 1 argument" (requiere exactamente 1 argumento) para comprender sus causas, y luego aprenderemos a resolverlo.
Provocando el Error
Primero, naveguemos a nuestro directorio del proyecto si aún no estamos allí:
cd ~/project/buildx-test
Ahora, intentemos construir una imagen usando Docker Buildx sin especificar el contexto de construcción:
docker buildx build
Debería ver un mensaje de error similar a:
"docker buildx build" requires exactly 1 argument.
See 'docker buildx build --help'.
Usage: docker buildx build [OPTIONS] PATH | URL | -
Este error ocurre porque el comando docker buildx build requiere un contexto de construcción (el directorio que contiene el Dockerfile) como argumento.
Comprensión del Error
El error "requires exactly 1 argument" (requiere exactamente 1 argumento) significa que Docker Buildx necesita saber dónde encontrar los archivos necesarios para construir la imagen. Este argumento es típicamente una ruta al directorio que contiene su Dockerfile (el contexto de construcción).
Los escenarios comunes que desencadenan este error incluyen:
- Olvidar especificar el contexto de construcción
- Usar una sintaxis de comando incorrecta
- Colocar opciones en el orden incorrecto
Corrección del Error
Corrijamos el comando agregando el contexto de construcción. La forma más sencilla es usar . para indicar el directorio actual:
docker buildx build .
Esta vez, Docker iniciará el proceso de construcción, pero notaremos que no etiqueta la imagen, lo que dificulta su referencia posterior.
Detengamos la construcción con Ctrl+C si aún se está ejecutando, e intentemos de nuevo con una etiqueta adecuada:
docker buildx build -t nginx-test:latest .
Debería ver una salida que muestra el progreso de la construcción:
[+] Building 12.8s (7/7) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 203B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 34B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:22.04 0.5s
=> [1/3] FROM docker.io/library/ubuntu:22.04@sha256:... 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get install -y curl nginx 0.0s
=> CACHED [3/3] EXPOSE 80 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:... 0.0s
=> => naming to docker.io/library/nginx-test:latest 0.0s
Uso de Diferentes Opciones de Buildx
Exploremos algunas opciones adicionales con Docker Buildx:
- Construyendo y cargando la imagen en el almacén de imágenes local de Docker:
docker buildx build --load -t nginx-test:local .
- Construyendo sin usar la caché de construcción (forzando una construcción nueva):
docker buildx build --no-cache -t nginx-test:nocache .
- Construyendo y generando solo el ID de la imagen final:
docker buildx build -q -t nginx-test:quiet .
Verificación de las Imágenes Construidas
Verifiquemos las imágenes que hemos construido:
docker images | grep nginx-test
Debería ver una salida similar a:
nginx-test quiet abcdef123456 5 minutes ago 123MB
nginx-test nocache fedcba654321 5 minutes ago 123MB
nginx-test local 123456abcdef 5 minutes ago 123MB
nginx-test latest abcdef123456 5 minutes ago 123MB
Ahora comprende el error común "requires exactly 1 argument" (requiere exactamente 1 argumento) con Docker Buildx y sabe cómo construir imágenes correctamente con varias opciones.
Construyendo Imágenes Multi-Arquitectura con Docker Buildx
Una de las características más poderosas de Docker Buildx es su capacidad para construir imágenes para múltiples arquitecturas simultáneamente. En este paso, aprenderemos a crear imágenes multi-arquitectura.
Comprensión de las Imágenes Multi-Arquitectura
Las imágenes multi-arquitectura permiten que el mismo nombre de imagen funcione en diferentes plataformas (como AMD64, ARM64, etc.). Docker selecciona automáticamente la versión apropiada para la arquitectura del host cuando se extrae la imagen.
Esto es especialmente útil para:
- Soportar dispositivos basados tanto en x86 como en ARM
- Asegurar que sus aplicaciones se ejecuten en varios proveedores de la nube
- Construir para dispositivos IoT con diferentes arquitecturas
Configuración para Construcciones Multi-Arquitectura
Docker Buildx necesita ser configurado para construcciones multi-arquitectura. Primero, asegurémonos de que nuestro constructor soporte esta característica:
docker buildx inspect --bootstrap mybuilder
Si ve un error sobre que el constructor no está disponible, recreémoslo con la configuración correcta:
docker buildx rm mybuilder
docker buildx create --name mybuilder --driver docker-container --bootstrap --use
Creación de una Imagen Multi-Arquitectura
Ahora, construyamos nuestra imagen Nginx para múltiples arquitecturas:
docker buildx build --platform linux/amd64,linux/arm64 -t nginx-test:multi .
Podría ver un mensaje de error similar a:
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
Esto sucede porque el controlador Docker predeterminado no admite construcciones multi-arquitectura. Modifiquemos nuestro enfoque.
Para fines de demostración, construiremos para plataformas específicas por separado:
docker buildx build --platform linux/amd64 -t nginx-test:amd64 --load .
Esto construye la imagen específicamente para la arquitectura AMD64 y la carga en el almacén de imágenes local de Docker.
Uso de Argumentos de Construcción
Docker Buildx nos permite usar argumentos de construcción para personalizar nuestras construcciones. Modifiquemos nuestro Dockerfile para usar un argumento de construcción:
nano Dockerfile
Actualice el contenido del Dockerfile a:
FROM ubuntu:22.04
ARG PACKAGE=nginx
RUN apt-get update && apt-get install -y \
curl \
${PACKAGE} \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Presione Ctrl+O seguido de Enter para guardar, luego Ctrl+X para salir de nano.
Ahora podemos construir la imagen con un paquete personalizado:
docker buildx build --build-arg PACKAGE=nginx-extras -t nginx-extras:latest .
Empujando a un Registro (Opcional)
Para utilizar completamente las imágenes multi-arquitectura, normalmente las empujaría a un registro. Esto requiere credenciales de Docker Hub o un registro privado. En un escenario del mundo real, el comando se vería así:
## Ejemplo solamente - no requerido para este laboratorio
## docker buildx build --platform linux/amd64,linux/arm64 -t username/nginx-test:multi --push .
Inspeccionando Imágenes
Examinemos las imágenes que hemos creado:
docker images | grep nginx
Debería ver una salida similar a:
nginx-extras latest abcdef123456 1 minute ago 130MB
nginx-test amd64 123456abcdef 2 minutes ago 123MB
nginx-test latest fedcba654321 10 minutes ago 123MB
Probando Nuestra Imagen
Finalmente, ejecutemos un contenedor usando nuestra imagen para verificar que funcione:
docker run -d --name test-nginx -p 8080:80 nginx-test:latest
Verifique si el contenedor se está ejecutando:
docker ps
Debería ver una salida que indica que su contenedor se está ejecutando:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abcdef123456 nginx-test:latest "nginx -g 'daemon of…" 10 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp test-nginx
Hagamos un curl al servidor nginx para asegurarnos de que está respondiendo:
curl http://localhost:8080
Debería ver la página de bienvenida HTML predeterminada de Nginx.
Cuando termine, limpie el contenedor:
docker stop test-nginx
docker rm test-nginx
¡Felicidades! Ha trabajado con éxito con Docker Buildx, ha comprendido y resuelto el error "requires exactly 1 argument" (requiere exactamente 1 argumento), y ha aprendido a crear construcciones especializadas para diferentes arquitecturas.
Resumen
En este laboratorio, obtuvo experiencia práctica con Docker Buildx y aprendió a solucionar el error común "requires exactly 1 argument" (requiere exactamente 1 argumento). Esto es lo que logró:
- Configurar Docker Buildx y crear una instancia de constructor
- Crear un Dockerfile básico para pruebas
- Encontrar, comprender y resolver el error "requires exactly 1 argument" (requiere exactamente 1 argumento)
- Construir imágenes de Docker con varias opciones y configuraciones
- Aprender los conceptos básicos de la construcción de imágenes multi-arquitectura
Estas habilidades proporcionan una base sólida para trabajar con Docker en entornos de desarrollo modernos, donde las aplicaciones a menudo necesitan ejecutarse en diversas plataformas de hardware. Ahora puede usar con confianza Docker Buildx para crear imágenes de contenedor eficientes y específicas de la plataforma, evitando errores comunes.
A medida que continúe su viaje con Docker, considere explorar funciones más avanzadas de Buildx, integrarlo en las tuberías de CI/CD y usarlo para construir aplicaciones verdaderamente portátiles que puedan ejecutarse en cualquier lugar.



