繁体   English   中英

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

[英]docker-compose only mount files that exist on host to container

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

示例 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 图像,而不能用于卷。 我仍然认为可以指定自定义驱动程序,但不确定如何指定。 作为临时修复,我做了一些花哨的东西,将容器中的东西映射出来,对其进行区分并将其放回原处,但并不理想。

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

不。唯一的 Docker 安装选项是直接“用主机中的等效目录替换容器中的此目录”。 没有办法修改它,有选择地隐藏子目录,或者实现你的“只有它已经存在”的规则。

在您展示的示例中,您可能根本不需要卷。 index.phpvendor目录这样的文件是应用程序源代码,在典型的使用中,你会写一个 Dockerfile, COPY index.php . 将文件移动到图像中,然后RUN composer ...创建供应商树。 这将与您的主机环境隔离,因此映像中的vendor目录将与主机系统上存在的任何内容分开。

实际上,没有选项可以控制这种行为,例如,如何处理源和目标之间的数据。 但如果大卫的回答不是你的情况,你可以做这样的事情:

version: '3.2'

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

volumes:
  data:

docker 文档如何说:

如果您启动一个创建新卷的容器,并且该容器在要挂载的目录中有文件或目录,则该目录的内容将被复制到该卷中。

所以在那之后,让我们稍微调查一下:

/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保存到名为 volume 的data 来自主机的数据位于主机文件夹中。 现在,您可以使用cprsync使用您想要的任何规则从主机文件夹复制到src

这是一个相当可疑和人为的例子,也许重新考虑当前的实现是个好主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM