Compartir comentarios
Las respuestas se generan en base a la documentación.

Driver Docker container

El driver Docker container permite crear un entorno de BuildKit gestionado y personalizable en un contenedor Docker dedicado.

El uso del driver Docker container ofrece algunas ventajas sobre el driver Docker predeterminado. Por ejemplo:

Sinopsis

Ejecuta el siguiente comando para crear un nuevo builder, llamado container, que utilice el driver Docker container:

$ docker buildx create \
  --name container \
  --driver=docker-container \
  --driver-opt=[key=value,...]
container

La siguiente tabla describe las opciones específicas del driver disponibles que puedes pasar a --driver-opt:

ParámetroTipoPredeterminadoDescripción
imageStringEstablece la imagen de BuildKit que se utilizará para el contenedor.
memoryStringEstablece la cantidad de memoria que puede utilizar el contenedor.
memory-swapStringEstablece el límite de memoria swap para el contenedor.
cpu-quotaStringImpone una cuota CPU CFS en el contenedor.
cpu-periodStringEstablece el período del planificador CPU CFS para el contenedor.
cpu-sharesStringConfigura las cuotas de CPU (peso relativo) del contenedor.
cpuset-cpusStringLimita el conjunto de núcleos de CPU que puede utilizar el contenedor.
cpuset-memsStringLimita el conjunto de nodos de memoria de CPU que puede utilizar el contenedor.
default-loadBooleanfalseCarga automáticamente las imágenes en el almacenamiento de imágenes de Docker Engine.
networkStringEstablece el modo de red para el contenedor.
cgroup-parentString/docker/buildxEstablece el cgroup padre del contenedor si Docker utiliza el driver "cgroupfs".
restart-policyStringunless-stoppedEstablece la política de reinicio del contenedor.
env.<key>StringEstablece la variable de entorno key con el value especificado en el contenedor.
provenance-add-ghaBooleantrueEscribe automáticamente el contexto de GitHub Actions en el builder para la procedencia (provenance).

Antes de configurar los límites de recursos para el contenedor, consulta Configuración de restricciones de recursos en tiempo de ejecución para contenedores.

Uso

Cuando ejecutas una compilación, Buildx descarga la imagen (image) especificada (por defecto, moby/buildkit). Una vez iniciado el contenedor, Buildx envía la compilación solicitada al servidor de compilación contenido dentro del contenedor.

$ docker buildx build -t <image> --builder=container .
WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load
#1 [internal] booting buildkit
#1 pulling image moby/buildkit:buildx-stable-1
#1 pulling image moby/buildkit:buildx-stable-1 1.9s done
#1 creating container buildx_buildkit_container0
#1 creating container buildx_buildkit_container0 0.5s done
#1 DONE 2.4s
...

Persistencia de caché

El driver docker-container admite la persistencia de caché, ya que almacena todo el estado de BuildKit y la caché relacionada en un volumen de Docker dedicado.

Para conservar la caché del driver docker-container, incluso después de volver a crear el driver usando docker buildx rm y docker buildx create, puedes destruir el builder utilizando la bandera --keep-state:

Por ejemplo, para crear un builder llamado container y luego eliminarlo conservando su estado:

# configurar un builder
$ docker buildx create --name=container --driver=docker-container --use --bootstrap
container
$ docker buildx ls
NAME/NODE       DRIVER/ENDPOINT              STATUS   BUILDKIT PLATFORMS
container *     docker-container
  container0    desktop-linux                running  v0.10.5  linux/amd64
$ docker volume ls
DRIVER    VOLUME NAME
local     buildx_buildkit_container0_state

# eliminar el builder conservando su estado
$ docker buildx rm --keep-state container
$ docker volume ls
DRIVER    VOLUME NAME
local     buildx_buildkit_container0_state

# ¡el nuevo driver creado con el mismo nombre tendrá todo el estado del anterior!
$ docker buildx create --name=container --driver=docker-container --use --bootstrap
container

QEMU

El driver docker-container admite el uso de QEMU (modo de usuario) para compilar en plataformas no nativas. Utiliza la bandera --platform para especificar las arquitecturas para las que deseas realizar la compilación.

Por ejemplo, para compilar una imagen de Linux para amd64 y arm64:

$ docker buildx build \
  --builder=container \
  --platform=linux/amd64,linux/arm64 \
  -t <registry>/<image> \
  --push .
Note

La emulación con QEMU puede ser mucho más lenta que las compilaciones nativas, especialmente para tareas con un uso intensivo de procesamiento, como la compilación y la compresión o descompresión.

Red personalizada

Puedes personalizar la red que utiliza el contenedor del builder. Esto es útil si necesitas emplear una red específica para tus compilaciones.

Por ejemplo, creemos una red llamada foonet:

$ docker network create foonet

Ahora crea un builder docker-container que utilizará esta red:

$ docker buildx create --use \
  --name mybuilder \
  --driver docker-container \
  --driver-opt "network=foonet"

Inicia e inspecciona mybuilder:

$ docker buildx inspect --bootstrap

Inspecciona el contenedor del builder y comprueba qué red se está utilizando:

$ docker inspect buildx_buildkit_mybuilder0 --format={{.NetworkSettings.Networks}}
map[foonet:0xc00018c0c0]

Lectura adicional

Para obtener más información sobre el driver Docker container, consulta la referencia de buildx.