如何将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 文件的读取权限。
我找到了两种解决问题的方法,但它们看起来都很老套。
将数据卷添加到 docker 容器,其中包含 WordPress 文件的路径
docker 运行 ... -v /usr/share/wordpress/ ...
Docker 将此目录添加到主机上的路径 /var/lib/docker/vfs/dir... 但是您需要使用 docker inspect 查找实际路径并且您需要 root 访问权限才能查看文件。
正在将主机目录挂载到 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:我不确定这是否适合生产,但它应该适用于开发场景!
在 docker 容器中挂载主机目录非常容易。
但我需要反过来。
我使用 docker 容器作为开发 WordPress 插件的开发环境。这个 docker 容器包含 运行 WordPress(MySQL、Apache、PHP 和 WordPress)所需的一切。我将我的插件 src 文件夹从主机安装在 docker 容器中,以便我可以在开发过程中测试我的插件。
对于调试,如果我在主机上的 IDE 运行ning 具有对 docker 容器中的 WordPress 文件的读取权限。
我找到了两种解决问题的方法,但它们看起来都很老套。
将数据卷添加到 docker 容器,其中包含 WordPress 文件的路径
docker 运行 ... -v /usr/share/wordpress/ ...
Docker 将此目录添加到主机上的路径 /var/lib/docker/vfs/dir... 但是您需要使用 docker inspect 查找实际路径并且您需要 root 访问权限才能查看文件。
正在将主机目录挂载到 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:我不确定这是否适合生产,但它应该适用于开发场景!