首页 文章

向Docker添加卷,但排除子文件夹

提问于
浏览
109

假设我有一个Docker容器和主机上的文件夹 /hostFolder . 现在,如果我想将此文件夹作为卷添加到Docker容器中,那么我可以通过在 Dockerfile 中使用 ADD 或将其作为卷安装来执行此操作 .

到现在为止还挺好 .

现在 /hostFolder 包含一个子文件夹 /hostFolder/subFolder .

我想将 /hostFolder 挂载到Docker容器中(无论是读写还是只读都无关紧要,对我来说都适用),但是我想 NOT 想要包含它 /hostFolder/subFolder . 我想排除这个,我也希望Docker容器能够对这个子文件夹进行更改,而不会在主机上更改它 .

这可能吗?如果是这样,怎么样?

4 回答

  • 77

    使用docker-compose我可以在本地使用node_modules,但是使用 docker-compose.yml 中的以下语法在docker容器中忽略它

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

    所以 ./angularApp 中的所有内容都映射到 /opt/app 然后我创建了另一个挂载卷 /opt/app/node_modules/ ,它现在是空目录 - 即使在我的本地计算机 ./angularApp/node_modules 不为空 .

  • 180

    如果您希望docker-compose忽略子目录但持久化,则可以在 docker-compose.yml 中执行以下操作:

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

    这会将您当前的目录挂载为共享卷,但挂载持久性docker卷代替本地 node_modules 目录 . 这类似于@kernix的答案,但是这将允许 node_modulesdocker-compose up 次运行之间持续存在,这可能是期望的行为 .

  • 13

    首先,在Dockerfile中使用 ADD 指令与使用卷(通过 -v 参数到 docker run 或Dockerfile中的 VOLUME 指令)非常不同 . ADDCOPY 命令只是在运行 docker build 时获取文件的副本 . 在使用 docker build 命令创建新图像之前,不会更新这些文件 . 相比之下,使用音量基本上是说"this directory should not be stored in the container image; instead use a directory on the host";每当卷中的文件发生更改时,主机和容器都会立即看到它 .

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

    但是,使用 COPY (应优先于 ADD )实现起来非常简单 . 您可以使用 .dockerignore 文件排除子目录,也可以 COPY 所有文件然后执行 RUN rm bla 以删除子目录 .

    请记住,使用 COPYADD 添加到图像的任何文件都必须位于构建上下文中,即在您运行的目录中或者下面.1484586_ .

  • 11

    要排除文件,请使用以下命令

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

相关问题