将一个卷添加到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_modulesnode_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指令)完全不同。 ADDCOPY命令只是在docker build运行时获取文件的副本。 在使用docker build命令创build新映像之前,不会更新这些文件。 相比之下,使用卷本质上是说“这个目录不应该存储在容器的图像;而是使用主机上的目录”; 每当卷内的文件发生变化时,主机和容器都会立即看到它。

我不相信你可以用卷来实现你想要的东西,如果你想要这样做,你将不得不重新思考你的目录结构。

但是,使用COPY (这应该是ADD首选)很简单。 您可以使用.dockerignore文件来排除子目录,也可以COPY所有文件,然后执行RUN rm bla删除子目录。

请记住,使用COPYADD添加到图像中的任何文件必须位于构build上下文内,即在运行docker build的目录中或之下。

要排除文件,请使用以下内容

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