如何将docker容器中的目录挂载到宿主机上?

How to mount a directory in the docker container to the host?

在 docker 容器中挂载主机目录非常容易。

但我需要反过来。

我使用 docker 容器作为开发 WordPress 插件的开发环境。这个 docker 容器包含 运行 WordPress(MySQL、Apache、PHP 和 WordPress)所需的一切。我将我的插件 src 文件夹从主机安装在 docker 容器中,以便我可以在开发过程中测试我的插件。

对于调试,如果我在主机上的 IDE 运行ning 具有对 docker 容器中的 WordPress 文件的读取权限。

我找到了两种解决问题的方法,但它们看起来都很老套。

  1. 将数据卷添加到 docker 容器,其中包含 WordPress 文件的路径

    docker 运行 ... -v /usr/share/wordpress/ ...

    Docker 将此目录添加到主机上的路径 /var/lib/docker/vfs/dir... 但是您需要使用 docker inspect 查找实际路径并且您需要 root 访问权限才能查看文件。

  2. 正在将主机目录挂载到 docker 容器并将容器中的 WordPress 文件复制到挂载的主机目录。符号链接似乎不起作用。

有更好的方法吗?不复制文件或更改访问权限?

谢谢!

为什么不直接做:docker run ... -v /usr/share/wordpress/:/usr/share/wordpress。现在,您的本地 /usr/share/wordpress/ 已映射到 Docker 容器中的 /usr/share/wordpress,并且两者具有相同的文件。您也可以通过这种方式安装在容器中的其他地方。语法是 host_path:container_path,所以如果你想将 /usr/share/wordpress 从主机挂载到容器上的 /my/new/path,你只需执行:docker run ... -v /usr/share/wordpress/:/my/new/path.

您可以使用 smb 与 svendowideits samba container 共享文件,如下所示:

docker run --rm -v $(which docker):/docker -v /var/run/docker.sock:/docker.sock svendowideit/samba <container name>

将 WordPress 文件复制到安装的文件夹是解决方案。

我将容器中的文件从原始文件夹移动到挂载文件夹,并使用符号 links 将它们 link 返回到原始文件夹。

重要的是,容器可以跟随容器中的符号 link,但主机不能。所以仅仅使用从原始文件夹到挂载文件夹的符号link是行不通的,因为宿主在容器中不能跟随符号link!

如果您使用 volume 而不是文件系统路径,则可以这样做。如果它不存在,它会自动为您创建。

docker run -d -v usr_share_wordpress:/usr/share/wordpress --name your_container ... image

停止或删除容器后,您的卷将与容器中的文件一起存储在文件系统中。

您可以使用 busybox 图像在 your_container 的生命周期内检查卷内容。类似于:

docker run -it --rm --volumes-from your_container busybox sh

关闭 your_container 后,您仍然可以使用以下方法检查音量:

docker run -it --rm -v usr_share_wordpress:/usr/share/wordpress busybox sh

列出 docker volume ls 卷。

我也有类似的需要将容器中的文件暴露给主机。截至今天,有一个 open issue。提到的一种解决方法是使用 binds,非常简洁;它在容器启动且 运行:

时工作
container_root=$(docker inspect --format {{.State.Pid}} "$container_name")/root
sudo bindfs --map=root/"$USER" "$container_root/$app_folder" "$host_folder"

PS:我不确定这是否适合生产,但它应该适用于开发场景!