前言:我意识到这个问题很老了,而且提问者可能已经找到了解决方法,但由于我没有看到准确的答案,所以我觉得适当回答一下提问者提出的问题以及任何相关问题。
首先,澄清命名卷和绑定挂载之间的区别。前者将允许您从容器外部查看已经存在于容器位置的文件,而后者则不会。实质上,绑定挂载非常类似于在xNIX中挂载卷,这意味着在设备挂载后,挂载位置中已有的任何文件都将被屏蔽-可以将其视为叠加。
接下来,当您指定./Frontend/ :/var/www/html/
时,您正在指定一个绑定挂载,这就是为什么当您在主机端查看./Frontend
时,您期望看到的所有文件都消失了。如果我正确理解您的最终目标,您想通过容器内的/var/www/html/
中的文件,在容器外使用完全相同的位置进行访问。如果是这样,那么您可能需要使用命名卷以及用户指定的挂载点,如下所示:
volumes:
Frontend:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/var/www/html'
php:
build: php/
volumes:
- Frontend:/var/www/html/
请注意,如果没有上述的driver_opts
,则命名卷仍将存在,但宿主机侧的位置将在Docker区域内。通常情况下是/var/lib/docker/volumes
或类似的路径。确切的位置可以在docker inspect
命令的Mounts
部分中找到。
示例
这是我PiHole实验室主机上类似的设置。
docker-compose.yml(缩写)
volumes:
etc-pihole:
etc-dnsmasq.d:
etc-unbound:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/home/dockeruser/ct5/etc-unbound'
services:
pihole:
container_name: asbuilt_ct5
hostname: pb-asbuilt-5
volumes:
- './etc-pihole:/etc/pihole/'
- './etc-dnsmasq.d:/etc/dnsmasq.d/'
- 'etc-unbound:/etc/unbound/'
使用sudo docker inspect
命令的输出,仅包含Mount
部分(缩写)
"Mounts": [
{
"Type": "bind",
"Source": "/home/dockeruser/ct5/etc-dnsmasq.d",
"Destination": "/etc/dnsmasq.d",
},
{
"Type": "bind",
"Source": "/home/dockeruser/ct5/etc-pihole",
"Destination": "/etc/pihole",
},
{
"Type": "volume",
"Name": "ct5_etc-unbound",
"Source": "/var/lib/docker/volumes/ct5_etc-unbound/_data",
"Destination": "/etc/unbound",
"Driver": "local",
}
]
容器文件列表: /etc/unbound
root@pb-asbuilt-5:/# ls /etc/unbound
unbound.conf unbound.conf.d unbound_control.key unbound_control.pem unbound_server.key unbound_server.pem
主机端文件列表:/home/dockeruser/ct5/etc-unbound
[dockertest-srv1] > ls /home/dockeruser/ct5/etc-unbound
unbound.conf unbound.conf.d unbound_control.key unbound_control.pem unbound_server.key unbound_server.pem
volumes:
部分。您的镜像已经包含了数据,volumes:
部分只会覆盖数据。同时,请将其迁移至当前的docker-compose格式(版本2)。 - Bernard