将Docker绑定挂载移动到卷中。

11
实际上,我像这样运行我的容器,例如:
docker run -v /nexus-data:/nexus-data sonatype/nexus3
              ^

阅读文档后,我发现Docker完全可以管理数据卷。出于某些原因,我希望更改运行容器的方式,以实现以下操作:

docker run -v nexus-data:/nexus-data sonatype/nexus3
              ^

我想将我的现有绑定挂载转移到卷中。
但我不想丢失 /nexus-data 文件夹中的数据,有没有可能将该文件夹转移到新卷中,而无需重新启动所有内容?因为我还有 Jenkins 和 Sonar 容器,我只想改变持久数据的方式。有适当的方法来做到这一点吗?

可能有一种一流的方法来解决这个问题,但是一个巧妙的解决方案就是将两者都挂载到一个容器中,然后从容器内部将一个复制到另一个。 - Oliver Charlesworth
2个回答

6

您可以尝试以下步骤,以便不会丢失当前的nexus-data

#>docker run -v nexus-data:/nexus-data sonatype/nexus3
#>docker cp /nexus-data/. <container-name-or-id>:/nexus-data/
#>docker stop <container-name-or-id>
#>docker start <container-name-or-id>

docker cp 命令将从您的主机上的 /nexus-data 文件夹复制数据到容器的文件系统 /nexus-data 文件夹中,这是您挂载的卷。

如果在执行以下步骤时遇到任何问题,请告诉我。


端口(-p标志)怎么办,因为它们已经被占用了,我只是放置其他的,之后是否可以回来使用想要的端口? - fmdaboville
例如,我的 Nexus 容器使用 8081 端口,我更喜欢不改变它。 - fmdaboville
2
停止使用8081端口的第一个NEXUS容器,因为该容器已经将数据存储在主机目录(/nexus)中,您已经拥有了所有必需的信息。现在创建一个新的NEXUS容器,并挂载卷(nexus-data),并分配所需的8081端口,因为此时你的8081端口是空闲的(旧的NEXUS容器已停止)。 - fly2matrix
实际上,数据的存储与您的Nexus容器所监听的端口几乎没有关系。您可以启动和停止容器而不会丢失数据。 - Peter F
3
对我来说,docker copy /nexus-data/* <container-name-or-id>:/nexus-data 不起作用,docker cp /nexus-data/. <container-name-or-id>:/nexus-data 起作用了。从主机复制文件到Docker容器 - Stack Overflow - Jason Law
@JasonLaw -- 编辑了这篇文章以进行更正。(首次编辑由@besendorf完成,但不幸地是不完整的。) - Krokomot

2

这里有另外一种方法可以完成这个任务,我刚用 Heimdall 容器成功地实现了。在 sonatype/nexus3 镜像的文档 中已经详细介绍了这种方法:

  1. 停止运行中的容器(例如命名为 nexus3
  2. 创建一个名为 nexus-data 的 Docker 卷,使用以下命令创建:docker volume create nexus-data
  3. 默认情况下,Docker 将在 /var/lib/docker/volumes/nexus-data/_data/ 存储卷的内容
  4. 只需将您之前使用绑定挂载的目录复制到上述卷目录中(您需要超级用户权限才能执行此操作,或者用户必须是 docker 组的一部分):cp -R /path/to/nexus-data/* /var/lib/docker/volumes/nexus-data/_data/
  5. 使用以下命令重新启动 nexus3 容器:$ docker run -v nexus-data:/nexus-data sonatype/nexus3 --name=nexus3
  6. 您的容器将重新启动,并且现在在 docker 卷中镜像了目录 /path/to/nexus-data/ 中持久化的文件。当然,检查功能是否相同,如果是,则可以删除 /path/to/nexus-data/ 目录

证毕。


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