docker-compose仅将主机上存在的文件挂载到容器

时间:2019-11-25 11:53:09

标签: docker permissions docker-compose

是否可以将主机目录挂载到容器中,但仅允许覆盖主机上存在的文件?

示例GitHub存储库:https://github.com/UniBen/stackoverflow-59031249

例如 主持人:

src/
  public/
    index.php (200kb)

容器:

src/
  public/
    index.php (100kb)
  vendor/
  ...

所需的输出:(容器文件系统与已存在的已安装主机系统文件合并。请注意index.php文件的大小。)

src/
  public/
    index.php (200kb)
  vendor/
  ...

实际输出:

src/
  public/
    index.php (200kb)

docker-compose.yml示例

version: '3.2'

services:
    php:
      image: php
      volumes:
        - ./src:/src

编辑:如此看来,由docker实现的overlayfs仅用于构建docker映像,而不能用于卷。我仍然认为可以指定自定义驱动程序,但不确定如何。作为临时修复,我做了一些花哨的工作,将一些内容映射到容器之外,然后将它们扩散并放回容器中,但并不理想。

2 个答案:

答案 0 :(得分:1)

  

是否可以将主机目录安装到容器中,但是...

不。唯一的Docker挂载选项是简单明了的“用主机中的等效目录替换此目录在容器中”。无法修改它,有选择地隐藏子目录或实施“仅在已存在的情况下”规则。

在您显示的示例中,您可能根本不需要卷。像index.phpvendor目录这样的文件是应用程序源代码,在典型的用法中,您将编写一个Dockerfile,COPY index.php .将该文件移入映像,然后{{1}创建供应商树。这将与您的主机环境隔离,因此映像中的RUN composer ...目录将与主机系统上存在的目录分开。

答案 1 :(得分:1)

实际上,没有控制这种行为的选项,例如,如何处理源和目标之间的数据。但是,如果David的答案不是您的情况,那么您可以执行以下操作:

version: '3.2'

services:
  example:
    build:
      context: .
    volumes:
      - data:/src
      - ./src:/src/host

volumes:
  data:

码头工人documentation怎么说:

  

如果启动创建新卷的容器,则该容器   在要挂载的目录中有文件或目录   目录的内容已复制到卷中。

因此,在此之后,让我们进行一些调查:

/src # ls
file.a.txt  file.c.txt  host

/src # cat host/file.a.txt 
host

/src # cat file.a.txt 
container
/src # cat file.c.txt 
container

来自容器的数据将保存到名为data的卷中。来自主机的数据位于主机文件夹中。现在,您可以使用所需的任何规则,使用srccp从主机文件夹复制到rsync

这是一个非常繁琐且人为的示例,也许重新考虑当前的实现是一个好主意。