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

10

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

但我需要另一种方式。

我使用docker容器作为开发WordPress插件的环境。此docker容器包含运行WordPress所需的所有内容(MySQL、Apache、PHP和WordPress)。我将主机上的插件src文件夹挂载到docker容器中,以便在开发过程中测试我的插件。

为了调试,如果我的IDE在主机上运行,则读取docker容器中的WordPress文件将很有帮助。

我发现了两种解决方法,但都似乎很“hacky”。

  1. 向docker容器添加数据卷,路径为WordPress文件的路径

    docker run ... -v /usr/share/wordpress/ ...

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

  2. 将主机目录挂载到docker容器,并将WordPress文件复制到已挂载的主机目录中。符号链接似乎无法工作。

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

谢谢!

5个回答

1
将WordPress文件复制到挂载的文件夹是解决方案。
我将容器中的文件从原始文件夹移动到挂载的文件夹,并使用符号链接将它们链接回原始文件夹。
重要的部分是,容器可以遵循容器中的符号链接,但主机不能。因此,仅仅使用符号链接从原始文件夹到挂载的文件夹是不起作用的,因为主机无法遵循容器中的符号链接!

我们不能直接进入文件系统级别,例如/var/lib/docker并从主机文件夹到容器文件夹创建符号链接吗?只要您能找到它。 - Nishant

0

如果您使用而不是文件系统路径,就可以实现这一点。如果它不存在,它会自动为您创建。

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命令列出卷。

0

您可以使用svendowideits samba容器通过smb共享文件,方法如下:

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

0

我有一个类似的需求,需要将容器中的文件暴露给主机。截至今天,这个问题仍未解决。其中提到的一种解决方法是使用binds,非常巧妙;它可以在容器运行时使用:

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

附注:我不确定这对生产环境是否有好处,但在开发场景中应该可以工作!


-1
为什么不直接这样做: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

本地的 /usr/share/wordpress 将会替换掉容器中的 /usr/share/wordpress 内容。本地文件夹为空,只有容器文件夹包含 WordPress 文件。因此,容器中的 WordPress 文件将被空的本地文件夹所代替。我需要相反的方式。 - Kai Hofstetter
2
@KaiHofstetter 你可以通过将原始的WordPress文件保存在/usr/share/wordpress以外的其他位置,并在容器启动时将它们复制到那里(通常由入口脚本完成)来解决这个问题。这样一来,文件就会传回到主机映射目录中。 - Mykola Gurov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接