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 ADD
de la Dockerfile
o de montaje como un volumen.
Hasta aquí todo bien.
Ahora /hostFolder
contiene una subcarpeta, /hostFolder/subFolder
.
Quiero montar /hostFolder
en 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.yml
Entonces, todo
./angularApp
se asigna/opt/app
y luego creo otro volumen de montaje/opt/app/node_modules/
que ahora está vacío, incluso si mi máquina local./angularApp/node_modules
no 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_modules
If 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_modules
directorio local . Esto es similar a la respuesta de @kernix, pero permitiránode_modules
que persista entredocker-compose up
ejecuciones, lo que probablemente sea el comportamiento deseado.fuente
docker-compose down
eliminará los contenedores, pero el volumen persistirá hasta que ejecute algo comodocker system prune
node_modules:
volumen con nombre "ignora" el contenido/app/node_modules
en 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/null
en 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
ADD
instrucción en un Dockerfile es muy diferente de usar un volumen (ya sea a través del-v
argumentodocker run
o laVOLUME
instrucción en un Dockerfile). Los comandosADD
yCOPY
simplemente toman una copia de los archivos cuandodocker build
se ejecuta. Estos archivos no se actualizan hasta que se crea una imagen nueva con eldocker build
comando. 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.dockerignore
archivo para excluir el subdirectorio, o puede hacerCOPY
todos los archivosRUN rm bla
para eliminar el subdirectorio.Recuerde que cualquier archivo que agregue a la imagen con
COPY
oADD
debe estar dentro del contexto de compilación, es decir, en o debajo del directorio desde el que se ejecutadocker build
.fuente
.dockerignore
archivo para excluir un subdirectorio (o incluso un directorio). Dado que ese es el propósito declarado del archivo, es bastante extraño.squash
las capas. Uno es github.com/goldmann/docker-squash y otro está usandooc ex dockerbuild
el 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-rc3
la sintaxis de archivo v3.Con la línea de comando del acoplador:
La
-v
opción también se puede utilizar (crédito a Bogdan Mart ), pero--mount
es 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