如何将容器的安装点暴露给主机?

时间:2020-09-09 23:58:11

标签: docker

这不是常见问题解答:“如何安装主机目录,以便它在容器中可见”,答案为docker run -v /host/path:/container/path

相反,专用容器可以在安装点中装载一些有趣的数据。如何使该安装点内的数据在主机中可见?

例如运行gluster/gluster-centos glusterfs映像时,容器具有显示和安装glusterfs数据的功能。我可以在主机中显示这些数据,所以也不必在主机中安装glusterfs代码吗?

我尝试docker run -v /host/path:/container/path,然后从容器内部:

mkdir /container/path/mountpoint
mount -t glusterfs server:volume /container/path/mountpoint

在容器中,我可以在/container/path/mountpoint下的glusterfs卷中看到数据,但是在主机上,/host/path/mountpoint存在但为空。如何将容器/container/path/mountpoint中的数据暴露给主机?

编辑:我发现我可以看到挂载点内的数据为:

containerPid=$(docker inspect -f '{{.State.Pid}}' containername)
sudo ls -l /proc/$containerPid/root/container/path/mountpoint

但是我希望有一些更优雅的东西...(而且不需要root即可查看数据)

1 个答案:

答案 0 :(得分:0)

您正在寻找shared挂载标志(有关bind mounts的更多信息,请执行以下操作:

docker run -v /host/path:/container/path:shared ...

例如,如果我在主机上运行此命令(我需要--privileged才能使mount运行):

# mkdir /tmp/foo
# docker run -it --rm --privileged -v /tmp/foo:/foo:shared alpine sh

然后在容器内:

container# mkdir /foo/mnt
container# mount -o bind /etc /foo/mnt

在主机上,我看到:

# ls /tmp/foo
alpine-release  group     issue           motd        passwd     resolv.conf  ssl
apk             hostname  logrotate.d     mtab        periodic   securetty    sysctl.conf
conf.d          hosts     modprobe.d      network     profile    services     sysctl.d
crontabs        init.d    modules         opt         profile.d  shadow       udhcpd.conf
fstab           inittab   modules-load.d  os-release  protocols  shells

我认为这完全可以再现您的要求。