如何使已存在的 Docker 卷可从主机访问?

How to make an already existing Docker volume accessible from host?

我有一个 Docker 容器,其卷存储了大量我的 Jenkins 数据。我希望可以从主机访问这些文件。具体来说,我希望我的卷中的一个目录与主机上的某个文件夹共享。这是绑定安装、docker 卷或服务创建问题吗?我怎样才能做到这一点?

主机系统不能(*)直接访问卷数据。如果容器已经是运行,则可以docker cp从容器到宿主机的数据

docker cp jenkins:/var/jenkins_home ./jenkins

如果不是,那么您可以使用 Backup a container 中的过程从命名卷中复制它

docker run --rm -v jenkins_home:/jenkins -w / \
  busybox \
  tar cf - jenkins \
| tar xf -

无论哪种方式,您现在都会在您的主机上拥有一个目录 ./jenkins,您可以将其绑定到一个新容器中

docker run -v "$PWD/jenkins:/var/jenkins_home" ... jenkins/jenkins

您可以删除现在未使用的卷。

如果您有基于 Compose 的设置,则可以使用 docker-compose run 来简化导出。似乎没有 docker-compose 等同于 docker cp,但由于您要复制的数据位于命名卷中,所以这并不重要。

docker-compose run -w /var jenkins tar cf - jenkins_home | tar xf -
mv jenkins_home jenkins

然后将服务声明中的 volumes: 更改为引用 ./jenkins:/var/jenkins_home 而不是命名卷,并删除顶级 volumes: 块中的命名卷。

(*) 如果您在本机-Linux 主机上,Docker-内部存储中有一个路径包含作为普通目录的卷内容,但在内部查看Docker-内部存储通常不是最佳做法。