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:
- Especificar versiones personalizadas de BuildKit a utilizar.
- Compilar imágenes multi-arquitectura, consulta QEMU.
- Opciones avanzadas para la importación y exportación de caché.
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ámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
image | String | Establece la imagen de BuildKit que se utilizará para el contenedor. | |
memory | String | Establece la cantidad de memoria que puede utilizar el contenedor. | |
memory-swap | String | Establece el límite de memoria swap para el contenedor. | |
cpu-quota | String | Impone una cuota CPU CFS en el contenedor. | |
cpu-period | String | Establece el período del planificador CPU CFS para el contenedor. | |
cpu-shares | String | Configura las cuotas de CPU (peso relativo) del contenedor. | |
cpuset-cpus | String | Limita el conjunto de núcleos de CPU que puede utilizar el contenedor. | |
cpuset-mems | String | Limita el conjunto de nodos de memoria de CPU que puede utilizar el contenedor. | |
default-load | Boolean | false | Carga automáticamente las imágenes en el almacenamiento de imágenes de Docker Engine. |
network | String | Establece el modo de red para el contenedor. | |
cgroup-parent | String | /docker/buildx | Establece el cgroup padre del contenedor si Docker utiliza el driver "cgroupfs". |
restart-policy | String | unless-stopped | Establece la política de reinicio del contenedor. |
env.<key> | String | Establece la variable de entorno key con el value especificado en el contenedor. | |
provenance-add-gha | Boolean | true | Escribe 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 .
NoteLa 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.