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 intento hacerlo 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?

.dockerignoreRespuestas:
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
Dockerfileencuentra (entonces, elrpmsárbol completo ).Puede configurar un
.dockerignorearchivo para que Docker ignore algunos archivos. Es posible que desee experimentar con él.Alternativamente, puede mover su
rpmscarpeta un nivel de directorio por encima de suDockerfile, y solo enlace simbólicotest.rpmen elDockerfiledirectorio de.Como muchos usuarios señalaron en los comentarios, uno necesita agregar la
.gitcarpeta a la.dockerignoreque fue la causa de una diferencia de 150 MB -> 5 GB en mi caso.fuente
ADDcomando no sigue los enlaces sym durante una compilación. Ver: github.com/docker/docker/issues/1676tmploga.dockerignore+ otros personalizados.gitcarpeta está incluida por defecto, esto definitivamente me sorprendió.Actualización 2019
A partir de Docker v18.06, hay 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
Dockerfilesintaxis, no es necesario cambiar elDockerfile.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:
Nuevo Docker BuildKit:
El único cambio es la
DOCKER_BUILDKIT=1variable de entorno, la diferencia en el tiempo es enorme..dockerignoreExpedienteTenga en cuenta que el
.dockerignorearchivo sigue siendo válido y útil. AlgunosDockerfilecomandos comoCOPY . .seguirán teniendo en cuenta las.dockerignorereglas. Pero los archivos secundarios en el directorio de compilación (no referenciados en elDockerfile) ya no se copian como un "contexto de compilación" por parte del BuildKit.fuente
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.
fuente
Si tiene un
.dockerignorearchivo y el contexto de compilación sigue siendo grande, puede verificar lo que se envía al contexto de compilación de la ventana acoplable utilizando The Silver Searcher :Tenga en cuenta que algunos
**patrones pueden no funcionar correctamente.Vea este número de Github para comentarios adicionales: https://github.com/moby/moby/issues/16056
fuente
En mi caso, fue cuando
-fejecuté con argumentos incorrectos , sin ruta al directorio donde se encontraba Dockerfiledocker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/- derechodocker build --no-cache -t nginx5 -f /home/DF/Dockerfile- incorrectofuente
Si desea tener el control total de su contexto de compilación, también puede compilar el contenedor completamente sin ningún contexto y
COPYdatos relevantes en el contenedor después.Una desventaja de esto sería que con este enfoque solo puedes
ADDcosas 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--
fuente
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.
Construyendo desde el docker-dir lo siguiente estuvo bien
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
El contexto aquí está dado por el './base'
fuente
si está creando una imagen y recibe un mensaje que envía el contexto de compilación al docker daemon, que está tardando en copiarse,
luego agregue el archivo .dockerignore . Debe incluir los archivos o el directorio que no es necesario copiar.
fuente
Para
NodeJS Application, agregue un.dockerignorearchivo al directorio del proyecto raíz y dentro del.dockerignorearchivo agregue lo siguientefuente