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?
.dockerignore
Respuestas:
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
encuentra (entonces, elrpms
árbol completo ).Puede configurar un
.dockerignore
archivo para que Docker ignore algunos archivos. Es posible que desee experimentar con él.Alternativamente, puede mover su
rpms
carpeta un nivel de directorio por encima de suDockerfile
, y solo enlace simbólicotest.rpm
en elDockerfile
directorio de.Como muchos usuarios señalaron en los comentarios, uno necesita agregar la
.git
carpeta a la.dockerignore
que fue la causa de una diferencia de 150 MB -> 5 GB en mi caso.fuente
ADD
comando no sigue los enlaces sym durante una compilación. Ver: github.com/docker/docker/issues/1676tmp
log
a.dockerignore
+ otros personalizados.git
carpeta 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
Dockerfile
sintaxis, 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=1
variable de entorno, la diferencia en el tiempo es enorme..dockerignore
ExpedienteTenga en cuenta que el
.dockerignore
archivo sigue siendo válido y útil. AlgunosDockerfile
comandos comoCOPY . .
seguirán teniendo en cuenta las.dockerignore
reglas. 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
.dockerignore
archivo 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
-f
ejecuté 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
COPY
datos relevantes en el contenedor después.Una desventaja de esto sería que con este enfoque solo puedes
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--
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.dockerignore
archivo al directorio del proyecto raíz y dentro del.dockerignore
archivo agregue lo siguientefuente