run images imagenes dockers docker

docker - images - Construir contexto para la imagen del acoplador muy grande



download docker image (7)

He creado un par de directorios diferentes en mi máquina host mientras trato de aprender sobre Docker solo para mantener mis dockerfiles organizados. Mi Dockerfile que acabo de ejecutar se ve así:

FROM crystal/centos MAINTAINER crystal ADD ./rpms/test.rpm ./rpms/ RUN yum -y --nogpgcheck localinstall /rpms/test.rpm

Mi rpm actual es de solo 1 GB. Pero cuando trato de hacer sudo docker build -t="crystal/test" . , Recibo el contexto de compilación para Docker daemon 3.5 GB. ¿Hay algo más de lo que no estoy al tanto mientras continúas creando imágenes de Docker? ¿Se está acumulando mi memoria a medida que construyo más imágenes en mis otros directorios en mi máquina host?


Actualización 2019

A partir de Docker v18.06, existe una opción para usar un nuevo generador de imágenes llamado Build Kit .

Está incluido con el Docker, no es necesario instalar nada. Es compatible con la sintaxis de Dockerfile , no es necesario cambiar el Dockerfile .

Legacy Docker Build vs New Docker BuildKit

Aquí hay un ejemplo de cómo construir una imagen con un gran archivo sin usar en el directorio de compilación:

Docker Legacy Build:

$ time docker image build --no-cache . Sending build context to Docker daemon 4.315GB [...] Successfully built c9ec5d33e12e real 0m51.035s user 0m7.189s sys 0m10.712s

Nuevo Docker BuildKit:

$ time DOCKER_BUILDKIT=1 docker image build --no-cache . [+] Building 0.1s (5/5) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 37B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s [...] => => writing image sha256:ba5bca3a525ac97573b2e1d3cb936ad50cf8129eedfa9 0.0s real 0m0.166s user 0m0.034s sys 0m0.026s

El único cambio es la variable de entorno DOCKER_BUILDKIT=1 , la diferencia en el tiempo es enorme.

Archivo .dockerignore

Tenga en cuenta que el archivo .dockerignore sigue siendo válido y útil. Algunos comandos de Dockerfile como COPY . . COPY . . aún tendrá en cuenta las reglas .dockerignore . Pero los archivos secundarios en el directorio de compilación (no referenciados en el Dockerfile ) ya no se copian como un "contexto de compilación" por parte del BuildKit.


El cliente Docker envía todo el "contexto de compilación" al demonio Docker. Ese contexto de compilación (por defecto) es el directorio completo en el que se Dockerfile el Dockerfile (por lo tanto, todo el árbol rpms ).

Puede configurar un archivo .dockerignore para que Docker ignore algunos archivos. Es posible que desee experimentar con él.

Alternativamente, puede mover su carpeta rpms un nivel de directorio por encima de su Dockerfile y solo test.rpm simbólicamente test.rpm al directorio de Dockerfile .

Como muchos usuarios señalaron en los comentarios, uno necesita agregar la carpeta .git al .dockerignore que fue la causa de una diferencia de 150MB -> 5GB en mi caso.


En mi caso, fue cuando ejecuté con argumentos -f incorrectos, sin ruta al directorio donde se encontraba Dockerfile

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/ - right

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile - incorrecto


Lo arreglé moviendo mi Dockerfile y docker-compose.yml a una subcarpeta y funcionó muy bien. Aparentemente, Docker envía la carpeta actual al demonio y mi carpeta tenía 9 conciertos.


Si desea tener el control total de su contexto de compilación, también puede compilar el contenedor por completo sin ningún contexto y COPY datos relevantes en el contenedor posteriormente.

docker build - < Dockerfile

Una desventaja de esto sería que con este enfoque solo puede ADD cosas en el dockerfile que hacen referencia a una URL remota, y no archivos de su host local.

Ver https://docs.docker.com/engine/reference/commandline/build/#build-with--


Si tiene un archivo .dockerignore y el contexto de compilación sigue siendo grande, puede verificar lo que se está enviando al contexto de compilación de Docker usando The Silver Searcher :

ag --path-to-ignore .dockerignore --files-with-matches

Tenga en cuenta que algunos patrones ** podrían no funcionar correctamente.

Vea este número de Github para comentarios adicionales: https://github.com/moby/moby/issues/16056


Tuve el mismo problema que FreeStyler. Sin embargo, estaba construyendo desde un directorio uno desde mi contexto. Entonces, los argumentos -f eran correctos, el contexto era incorrecto.

project | -------docker-dir

Construyendo desde el docker-dir lo siguiente estuvo bien

docker build -t br_base:0.1 .

Construyendo desde el dock-dir, el contexto de construcción cambió. Por lo tanto, necesitaba cambiar el contexto en el comando. El contexto está dado por el ''.'' en el comando de arriba.

El nuevo comando del directorio del proyecto debe ser

docker build -t br_base:0.1 ./base

El contexto aquí está dado por el ''./base''