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

时间:2015-03-21 09:13:31

标签: docker dockerfile

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

到目前为止,非常好。

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

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

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

9 个答案:

答案 0 :(得分:245)

使用docker-compose我可以在本地使用node_modules,但在docker容器中使用docker-compose.yml

中的以下语法忽略它
volumes:
   - './angularApp:/opt/app'
   - /opt/app/node_modules/

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

答案 1 :(得分:98)

如果您希望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次运行之间保持,这可能是期望的行为。

答案 2 :(得分:14)

要排除文件,请使用以下

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

答案 3 :(得分:13)

首先,使用Dockerfile中的ADD指令非常与使用卷不同(通过-v参数docker run或{{ 1}} Dockerfile中的指令)。 VOLUMEADD命令只会在运行COPY时获取文件的副本。在使用docker build命令创建新图像之前,不会更新这些文件。相比之下,使用卷实质上是说“此目录不应存储在容器映像中;而是使用主机上的目录”;无论何时更改卷内的文件,主机和容器都会立即看到它。

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

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

请注意,您使用RUN rm blaCOPY添加到图片的所有文件都必须位于构建上下文中,即在您运行ADD目录的内部或下方。

答案 4 :(得分:8)

对于那些试图使工作流变得不错的地方,node_modules不会被本地覆盖的情况可能会有所帮助。

  1. 更改docker-compose以将匿名持久卷安装到node_modules,以防止您的本地覆盖它。此线程已对此进行了概述。
services:
  server:
    build: .
    volumes:
      - .:/app
      - /app/node_modules
  1. 这是我们所缺少的重要信息。旋转堆栈时,请使用docker-compose -V。没有这个,如果您添加新软件包并重建映像,它将使用您最初的docker-compose启动中的node_modules
    -V, --renew-anon-volumes   Recreate anonymous volumes instead of retrieving
                               data from the previous containers.

答案 5 :(得分:1)

看起来旧的解决方案不再起作用了(至少对我而言)。 创建一个空文件夹并将目标文件夹映射到它很有帮助。

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

答案 6 :(得分:0)

使用docker命令行:

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

也可以使用-v选项(记入Bogdan Mart),但是--mount更清晰,recommended

答案 7 :(得分:0)

对于还有问题的人,node_modules文件夹仍然会从本地系统覆盖,反之亦然

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

这是解决方案,将node_modules后面的/作为后缀。

答案 8 :(得分:0)

要排除计算机卷中包含的已装入文件,您必须通过将卷分配给该文件来覆盖它。 在您的配置文件中:

services:
  server:
    build : ./Dockerfile
    volumes:
      - .:/app

您的dockerfile中的示例:

# Image Location
FROM node:13.12.0-buster
VOLUME /app/you_overwrite_file