[英]docker unable to mount host directory to docker container with 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.php
和vendor
目录这样的文件是应用程序源代码,在典型的使用中,你会写一个 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
。 来自主机的数据位于主机文件夹中。 现在,您可以使用cp
或rsync
使用您想要的任何规则从主机文件夹复制到src
。
这是一个相当可疑和人为的例子,也许重新考虑当前的实现是个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.