Supongo que tengo un contenedor Docker y una carpeta en mi host /hostFolder. Ahora bien, si quiero añadir esta carpeta al contenedor acoplable como un volumen, entonces yo puedo hacer esto ya sea mediante el uso ADDde la Dockerfileo de montaje como un volumen.
Hasta aquí todo bien.
Ahora /hostFoldercontiene una subcarpeta, /hostFolder/subFolder.
Quiero montar /hostFolderen el contenedor de Docker (ya sea como lectura-escritura o solo lectura no importa, funciona para mí), pero NO quiero tenerlo incluido /hostFolder/subFolder. Quiero excluir esto, y también quiero que el contenedor Docker pueda realizar cambios en esta subcarpeta, sin la consecuencia de que también haya cambiado en el host.
es posible? ¿Si es así, cómo?
docker
dockerfile
Golo Roden
fuente
fuente

Respuestas:
Usando docker-compose, puedo usar node_modules localmente, pero lo ignoro en el contenedor de docker usando la siguiente sintaxis en
docker-compose.ymlEntonces, todo
./angularAppse asigna/opt/appy luego creo otro volumen de montaje/opt/app/node_modules/que ahora está vacío, incluso si mi máquina local./angularApp/node_modulesno está vacía.fuente
/opt/app/node_modules/directorios dentro del contenedor. Por ejemplo: necesito reemplazarlo por otro directorio con el mismo nombre. Se produce un error: 'volumen ocupado'-v $(pwd):/build/ -v /build/node_modulesIf you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents are copied into the volume.Si desea que Docker-compose ignore los subdirectorios pero sea persistente, puede hacer lo siguiente en
docker-compose.yml:Esto montará su directorio actual como un volumen compartido, pero montará un volumen acoplable persistente en lugar de su
node_modulesdirectorio local . Esto es similar a la respuesta de @kernix, pero permitiránode_modulesque persista entredocker-compose upejecuciones, lo que probablemente sea el comportamiento deseado.fuente
docker-compose downeliminará los contenedores, pero el volumen persistirá hasta que ejecute algo comodocker system prunenode_modules:volumen con nombre "ignora" el contenido/app/node_modulesen el contenedor de la ventana acoplable, ¿puede encontrar útil esta publicación? ¿Cómo maneja Docker varios tipos de montaje?Para excluir un archivo, use lo siguiente
fuente
Cannot start service xxx: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/dev/null\\\" to rootfs \\\"/var/lib/docker/overlay2/d15ed56ad020d408c63a1f6a6365dbb88d5d3b78a4605980d3faa9861102ef21/merged\\\" at [...] unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type. Agregar una barra diagonal final no ayudó./dev/nullen el contenedor, como un archivo de dispositivo.Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type. Esto no es exactamente lo que estaba buscando el OP, pero fue muy útil para mí, ya que necesitaba excluir un solo archivo.Primero, usar la
ADDinstrucción en un Dockerfile es muy diferente de usar un volumen (ya sea a través del-vargumentodocker runo laVOLUMEinstrucción en un Dockerfile). Los comandosADDyCOPYsimplemente toman una copia de los archivos cuandodocker buildse ejecuta. Estos archivos no se actualizan hasta que se crea una imagen nueva con eldocker buildcomando. Por el contrario, el uso de un volumen es esencialmente decir "este directorio no debe almacenarse en la imagen del contenedor; en su lugar, use un directorio en el host"; cada vez que se cambia un archivo dentro de un volumen, tanto el host como el contenedor lo verán de inmediato.No creo que pueda lograr lo que quiere usando volúmenes, tendrá que repensar la estructura de su directorio si desea hacer esto.
Sin embargo, es bastante simple de lograr usando
COPY(que debería preferirseADD). Puede usar un.dockerignorearchivo para excluir el subdirectorio, o puede hacerCOPYtodos los archivosRUN rm blapara eliminar el subdirectorio.Recuerde que cualquier archivo que agregue a la imagen con
COPYoADDdebe estar dentro del contexto de compilación, es decir, en o debajo del directorio desde el que se ejecutadocker build.fuente
.dockerignorearchivo para excluir un subdirectorio (o incluso un directorio). Dado que ese es el propósito declarado del archivo, es bastante extraño.squashlas capas. Uno es github.com/goldmann/docker-squash y otro está usandooc ex dockerbuildel proyecto openshift.Parece que la solución anterior ya no funciona (al menos para mí). Sin embargo, la creación de una carpeta vacía y el mapeo de la carpeta de destino ayudó.
fuente
docker-compose 1.25.0-rc3la sintaxis de archivo v3.Con la línea de comando del acoplador:
La
-vopción también se puede utilizar (crédito a Bogdan Mart ), pero--mountes más clara y recomendada .fuente
para las personas que también tuvieron el problema de que la carpeta node_modules aún se sobrescribiría de su sistema local y viceversa
Esta es la solución, con el final
/después de node_modules como la solución.fuente
Para excluir un archivo montado contenido en el volumen de su máquina, deberá sobrescribirlo asignando un volumen a este mismo archivo. En su archivo de configuración:
Un ejemplo en tu dockerfile:
fuente