tag run remove library hub docker dockerfile

remove - docker run image



Agregue un volumen a Docker, pero excluya una subcarpeta (7)

Supongo que tengo un contenedor Docker y una carpeta en mi host /hostFolder . Ahora, si deseo agregar esta carpeta al contenedor Docker como un volumen, entonces puedo hacerlo usando ADD en el Dockerfile o montándolo como un volumen.

Hasta ahora tan bueno.

Ahora /hostFolder contiene una subcarpeta, /hostFolder/subFolder .

Quiero montar /hostFolder en el contenedor Docker (ya sea como lectura-escritura o solo lectura, no funciona para mí), pero NO quiero que se incluya /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?


Con la línea de comando del acoplador:

docker run / --mount type=bind,src=/hostFolder,dst=/containerFolder / --mount type=volume,dst=/containerFolder/subFolder / ...other-args...

La opción -v también se puede usar (crédito a Bogdan Mart ), pero --mount es más claro y recommended .


Para excluir un archivo, use lo siguiente

volumes: - /hostFolder:/folder - /dev/null:/folder/fileToBeExcluded


Parece que la solución anterior ya no funciona (al menos para mí). Sin embargo, fue útil crear una carpeta vacía y asignar la carpeta de destino.

volumes: - ./angularApp:/opt/app - .empty:/opt/app/node_modules/


Primero, usar la instrucción ADD en un Dockerfile es muy diferente de usar un volumen (ya sea a través del argumento -v para docker run Docker o la instrucción VOLUME en un Dockerfile). Los comandos ADD y COPY solo toman una copia de los archivos en el momento en que se ejecuta docker build . Estos archivos no se actualizan hasta que se crea una imagen nueva con el comando de docker build . 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 preferirse a ADD ). Puede usar un archivo .dockerignore para excluir el subdirectorio, o puede COPY todos los archivos y luego hacer un RUN rm bla para eliminar el subdirectorio.

Recuerde que cualquier archivo que agregue a la imagen con COPY o ADD debe estar dentro del contexto de compilación, es decir, en o debajo del directorio desde el que ejecuta docker build .


Si desea que docker-compose ignore los subdirectorios pero sea persistente, puede hacer lo siguiente en docker-compose.yml :

volumes: node_modules: services: server: volumes: - .:/app - node_modules:/app/node_modules

Esto montará su directorio actual como un volumen compartido, pero montará un volumen de docker persistente en lugar de su directorio local node_modules . Esto es similar a la respuesta de @kernix, pero esto permitirá que node_modules persista entre docker-compose up ejecuciones de docker-compose up , que probablemente sea el comportamiento deseado.


Usando docker-compose, puedo usar node_modules localmente, pero lo ignoro en el contenedor de docker usando la siguiente sintaxis en docker-compose.yml

volumes: - ''./angularApp:/opt/app'' - /opt/app/node_modules/

Entonces, todo en ./angularApp se asigna a /opt/app y luego creo otro volumen de montaje /opt/app/node_modules/ que ahora es un directorio vacío, incluso si en mi máquina local ./angularApp/node_modules no está vacío.


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

volumes: node_modules: services: server: volumes: - .:/app - node_modules:/app/node_modules/

Esta es la solución, con el seguimiento / después de node_modules como la solución.