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.