是否可以将主机目录挂载到容器中,但仅允许覆盖主机上存在的文件?
示例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映像,而不能用于卷。我仍然认为可以指定自定义驱动程序,但不确定如何。作为临时修复,我做了一些花哨的工作,将一些内容映射到容器之外,然后将它们扩散并放回容器中,但并不理想。
答案 0 :(得分:1)
是否可以将主机目录安装到容器中,但是...
不。唯一的Docker挂载选项是简单明了的“用主机中的等效目录替换此目录在容器中”。无法修改它,有选择地隐藏子目录或实施“仅在已存在的情况下”规则。
在您显示的示例中,您可能根本不需要卷。像index.php
和vendor
目录这样的文件是应用程序源代码,在典型的用法中,您将编写一个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
的卷中。来自主机的数据位于主机文件夹中。现在,您可以使用所需的任何规则,使用src
或cp
从主机文件夹复制到rsync
。
这是一个非常繁琐且人为的示例,也许重新考虑当前的实现是一个好主意。