将一个卷添加到Docker,但排除一个子文件夹
假设我有一个Docker容器和一个在我的主机/hostFolder
主机文件夹上的文件夹。 现在,如果我想将这个文件夹作为一个卷添加到Docker容器中,那么我可以通过在Dockerfile
使用ADD
或者将其挂载为一个卷来执行此操作。
到现在为止还挺好。
现在/hostFolder
包含一个子文件夹/hostFolder/subFolder
。
我想将/hostFolder
挂载到Docker容器中(无论是读写还是只读都无关紧要,对我都有效),但是我不希望将它包含在/hostFolder/subFolder
。 我想排除这个,我也希望Docker容器能够对这个子文件夹进行更改,而不必在主机上进行更改。
这可能吗? 如果是这样,怎么样?
如果你想让docker-compose.yml
-compose忽略子目录但是持久化,你可以在docker-compose.yml
执行以下docker-compose.yml
:
volumes: node_modules: services: server: volumes: - .:/app - node_modules:/app/node_modules
这会将当前目录挂载为共享卷,而是挂载一个持久性泊坞窗卷代替本地node_modules
目录。 这与@kernix的答案类似,但这将允许node_modules
在node_modules
docker-compose up
runs之间持续存在,这可能是所需的行为。
使用docker-compose我能够在本地使用node_modules,但在docker-compose.yml
中使用以下语法在docker-compose.yml
容器中忽略它
volumes: - './angularApp:/opt/app' - /opt/app/node_modules/
因此,. /opt/app
./angularApp
所有./angularApp
都映射到/opt/app
,然后创build另一个挂载卷/opt/app/node_modules/
现在是空目录 – 即使在我的本地计算机上./angularApp/node_modules
不为空。
首先,在Dockerfile中使用ADD
指令与使用卷(通过docker docker run
的-v
参数或Dockerfile中的VOLUME
指令)完全不同。 ADD
和COPY
命令只是在docker build
运行时获取文件的副本。 在使用docker build
命令创build新映像之前,不会更新这些文件。 相比之下,使用卷本质上是说“这个目录不应该存储在容器的图像;而是使用主机上的目录”; 每当卷内的文件发生变化时,主机和容器都会立即看到它。
我不相信你可以用卷来实现你想要的东西,如果你想要这样做,你将不得不重新思考你的目录结构。
但是,使用COPY
(这应该是ADD
首选)很简单。 您可以使用.dockerignore
文件来排除子目录,也可以COPY
所有文件,然后执行RUN rm bla
删除子目录。
请记住,使用COPY
或ADD
添加到图像中的任何文件必须位于构build上下文内,即在运行docker build
的目录中或之下。
要排除文件,请使用以下内容
volumes: - /hostFolder:/folder - /dev/null:/folder/fileToBeExcluded