docker image build
| Descripción | Construye una imagen a partir de un Dockerfile |
|---|---|
| Uso | docker image build [OPTIONS] PATH | URL | - |
| Alias | docker build
docker builder build |
Descripción
ImportantEsta página se refiere a la implementación heredada (legacy) de
docker build, que utiliza el motor de construcción heredado (anterior a BuildKit). Esta configuración solo es relevante si estás construyendo contenedores de Windows.Para obtener información sobre el comando predeterminado
docker build, que utiliza Buildx, consultadocker buildx build.
Cuando se construye con el constructor heredado, las imágenes se crean a partir de un Dockerfile ejecutando una secuencia de commits. Este proceso es ineficiente y lento en comparación con el uso de BuildKit, por lo que esta estrategia de construcción está obsoleta para todos los casos de uso excepto para la construcción de contenedores de Windows. Sigue siendo útil para construir contenedores de Windows porque BuildKit aún no tiene paridad completa de características para Windows.
Las construcciones invocadas con docker build utilizan Buildx (y BuildKit) por defecto, a menos que:
- Estés ejecutando Docker Engine en modo de contenedor de Windows
- Te excluyas explícitamente del uso de BuildKit estableciendo la variable de entorno
DOCKER_BUILDKIT=0.
Las descripciones de esta página solo cubren información exclusiva del
constructor heredado y casos en los que el comportamiento en el constructor heredado difiere del
comportamiento en BuildKit. Para obtener información sobre las características y flags comunes
entre el constructor heredado y BuildKit, como --tag y --target, consulta
la documentación de
docker buildx build.
Contexto de construcción con el constructor heredado
El contexto de construcción es el argumento posicional que pasas al invocar el comando
de construcción. En el siguiente ejemplo, el contexto es ., que significa el directorio
de trabajo actual.
$ docker build .
Cuando se utiliza el constructor heredado, el contexto de construcción se envía al demonio en su totalidad. Con BuildKit, solo se transmiten los archivos que utilizas en tus construcciones. El constructor heredado no calcula qué archivos necesita de antemano. Esto significa que para construcciones con un contexto grande, la transferencia del contexto puede llevar mucho tiempo, incluso si solo estás utilizando un subconjunto de los archivos incluidos en el contexto.
Al utilizar el constructor heredado, es por lo tanto sumamente importante que consideres
detenidamente qué archivos incluyes en el contexto que especificas. Utiliza un archivo
.dockerignore
para evitar que los archivos y directorios que no requieres en tu construcción
sean enviados como parte del contexto de construcción.
Acceder a rutas fuera del contexto de construcción
El constructor heredado generará un error si intentas acceder a archivos fuera del contexto de construcción utilizando rutas relativas en tu Dockerfile.
FROM alpine
COPY ../../some-dir .$ docker build .
...
Step 2/2 : COPY ../../some-dir .
COPY failed: forbidden path outside the build context: ../../some-dir ()
BuildKit, por otro lado, elimina las rutas relativas principales que atraviesan fuera
del contexto de construcción. Reutilizando el ejemplo anterior, la ruta COPY ../../some-dir . se evalúa como COPY some-dir . con BuildKit.
Opciones
| Opción | Predeterminado | Descripción |
|---|---|---|
--add-host | Añade una asignación personalizada de host a IP (host:ip) | |
--build-arg | Establece variables en tiempo de construcción | |
--cache-from | Imágenes a considerar como fuentes de caché | |
--cgroup-parent | Establece el cgroup primario para las instrucciones RUN durante la construcción | |
--compress | Comprime el contexto de construcción utilizando gzip | |
--cpu-period | Limita el período del programador completamente justo (CFS) de la CPU | |
--cpu-quota | Limita la cuota del programador completamente justo (CFS) de la CPU | |
-c, --cpu-shares | Cuotas de CPU (peso relativo) | |
--cpuset-cpus | CPUs en las que se permite la ejecución (0-3, 0,1) | |
--cpuset-mems | Memoria (MEMs) en las que se permite la ejecución (0-3, 0,1) | |
-f, --file | Nombre del Dockerfile (el valor predeterminado es PATH/Dockerfile) | |
--force-rm | Elimina siempre los contenedores intermedios | |
--iidfile | Escribe el ID de la imagen en el archivo | |
--isolation | Tecnología de aislamiento del contenedor | |
--label | Establece metadatos para una imagen | |
-m, --memory | Límite de memoria | |
--memory-swap | Límite de intercambio (swap) igual a la memoria más el intercambio: -1 para habilitar intercambio ilimitado | |
--network | API 1.25+ Establece el modo de red para las instrucciones RUN durante la construcción | |
--no-cache | No utiliza la caché al construir la imagen | |
--platform | API 1.38+ Establece la plataforma si el servidor tiene capacidad multiplataforma | |
--pull | Intenta siempre descargar (pull) una versión más reciente de la imagen | |
-q, --quiet | Suprime la salida de la construcción e imprime el ID de la imagen en caso de éxito | |
--rm | true | Elimina los contenedores intermedios después de una construcción exitosa |
--security-opt | Opciones de seguridad | |
--shm-size | Tamaño de /dev/shm | |
--squash | API 1.25+ experimental (demonio) Aplana (squash) las capas recién construidas en una sola capa nueva | |
-t, --tag | Nombre y opcionalmente una etiqueta en el formato nombre:etiqueta | |
--target | Establece la etapa de construcción de destino a construir. | |
--ulimit | Opciones de ulimit |
Ejemplos
Especificar la tecnología de aislamiento para el contenedor (--isolation)
Esta opción es útil en situaciones en las que estás ejecutando contenedores Docker en
Windows. La opción --isolation=<value> establece la tecnología de aislamiento de un contenedor.
En Linux, la única opción admitida es default, que utiliza espacios de nombres de Linux.
En Microsoft Windows, puedes especificar estos valores:
| Valor | Descripción |
|---|---|
default | Utiliza el valor especificado por la opción --exec-opt del demonio de Docker o el valor predeterminado del sistema. Si el demonio no especifica una tecnología de aislamiento, Windows utiliza process como su valor predeterminado. |
process | Únicamente aislamiento de espacios de nombres. |
hyperv | Aislamiento basado en particiones del hipervisor Hyper-V. |
Opciones de seguridad opcionales (--security-opt)
Este flag solo es compatible con un demonio que se ejecute en Windows y solo admite
la opción credentialspec. La opción credentialspec debe tener el formato
file://spec.txt o registry://keyname.
Aplastar (squash) las capas de una imagen (--squash) (experimental)
Descripción general
NoteLa opción
--squashes una característica experimental y no debe considerarse estable.
Una vez construida la imagen, este flag aplasta las nuevas capas en una nueva imagen con
una sola capa nueva. El aplastamiento no destruye ninguna imagen existente, sino que
crea una nueva imagen con el contenido de las capas aplastadas. Esto hace
que parezca que todos los comandos del Dockerfile se crearon con una sola capa.
El flag --squash conserva la caché de construcción.
El aplastamiento de capas puede ser beneficioso si tu Dockerfile produce múltiples capas que modifican los mismos archivos. Por ejemplo, archivos creados en un paso y eliminados en otro paso. Para otros casos de uso, el aplastamiento de imágenes puede tener un impacto negativo en el rendimiento. Al descargar una imagen que consta de múltiples capas, el demonio puede descargar capas en paralelo y permite compartir capas entre imágenes (ahorrando espacio).
Para la mayoría de los casos de uso, las construcciones de múltiples etapas (multi-stage) son una mejor alternativa, ya que ofrecen un control más detallado sobre tu construcción y pueden aprovechar futuras optimizaciones en el constructor. Consulta la sección de Construcciones de múltiples etapas para obtener más información.
Limitaciones conocidas
La opción --squash tiene una serie de limitaciones conocidas:
- Al aplastar capas, la imagen resultante no puede aprovechar el uso compartido de capas con otras imágenes y puede utilizar significativamente más espacio. Sigue siendo compatible el uso compartido de la imagen base.
- Al utilizar esta opción, es posible que observes que se utiliza un espacio significativamente mayor debido a que se almacenan dos copias de la imagen, una para la caché de construcción con todas las capas de la caché intactas y otra para la versión aplastada.
- Aunque el aplastamiento de capas puede producir imágenes más pequeñas, puede tener un impacto negativo en el rendimiento, ya que una sola capa tarda más en extraerse y no se puede paralelizar la descarga de una sola capa.
- Al intentar aplastar una imagen que no realiza cambios en el
sistema de archivos (por ejemplo, el Dockerfile solo contiene instrucciones
ENV), el paso de aplastamiento fallará (ver el problema #33823).
Requisitos previos
El ejemplo de esta página utiliza el modo experimental en Docker 23.03.
Puedes habilitar el modo experimental utilizando el flag --experimental al iniciar
el demonio de Docker o estableciendo experimental: true en el archivo de configuración daemon.json.
Por defecto, el modo experimental está desactivado. Para ver la configuración actual del
demonio de Docker, utiliza el comando docker version y comprueba la línea Experimental
en la sección Engine:
Client: Docker Engine - Community
Version: 28.5.1
API version: 1.51
Go version: go1.24.8
Git commit: e180ab8
Built: Wed Oct 8 12:16:17 2025
OS/Arch: darwin/arm64
Context: desktop-linux
Server: Docker Engine - Community
Engine:
Version: 28.5.1
API version: 1.51 (minimum version 1.24)
Go version: go1.24.8
Git commit: f8215cc
Built: Wed Oct 8 12:18:25 2025
OS/Arch: linux/arm64
Experimental: true
[...]
Construir una imagen con el flag --squash
A continuación se muestra un ejemplo de una construcción con el flag --squash. Debajo se presenta el
Dockerfile:
FROM busybox
RUN echo hello > /hello
RUN echo world >> /hello
RUN touch remove_me /remove_me
ENV HELLO=world
RUN rm /remove_meA continuación, construye una imagen llamada test utilizando el flag --squash.
$ docker build --squash -t test .
Una vez completada la construcción, el historial se ve como el siguiente. El historial podría mostrar que el nombre de una capa
es <missing> y que hay una nueva capa con el COMENTARIO merge.
$ docker history test
IMAGE CREATED CREATED BY SIZE COMMENT
4e10cb5b4cac 3 seconds ago 12 B merge sha256:88a7b0112a41826885df0e7072698006ee8f621c6ab99fca7fe9151d7b599702 to sha256:47bcc53f74dc94b1920f0b34f6036096526296767650f223433fe65c35f149eb
<missing> 5 minutes ago /bin/sh -c rm /remove_me 0 B
<missing> 5 minutes ago /bin/sh -c #(nop) ENV HELLO=world 0 B
<missing> 5 minutes ago /bin/sh -c touch remove_me /remove_me 0 B
<missing> 5 minutes ago /bin/sh -c echo world >> /hello 0 B
<missing> 6 minutes ago /bin/sh -c echo hello > /hello 0 B
<missing> 7 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0 B
<missing> 7 weeks ago /bin/sh -c #(nop) ADD file:47ca6e777c36a4cfff 1.113 MB
Prueba la imagen: comprueba que /remove_me haya desaparecido, asegúrate de que hello\nworld esté
en /hello y asegúrate de que el valor de la variable de entorno HELLO sea world.