如何将卷添加到现有的Docker容器?

我有一个Docker容器,我简单地通过在Ubuntu上安装Docker来创build:

sudo docker run -i -t ubuntu /bin/bash 

我立即开始安装Java和一些其他工具,花一些时间和它停止了容器

 exit 

然后,我想添加一个音量,并意识到这不像我想的那样简单。 如果我使用sudo docker -v /somedir run ...那么我最终将得到一个新的容器,所以我将安装Java,并执行之前完成的工作,然后才能到达装入卷的容器。

所有关于从主机安装文件夹的文档似乎暗示了安装卷是创build容器时可以完成的事情。 所以我必须避免从头开始重新configuration一个新的容器,唯一的办法就是将现有的容器提交到一个存储库,并在安装时使用它作为新容器的基础。

这确实是将卷添加到现有容器的唯一方法吗?

现在是的,唯一的办法就是娱乐。 当我们可以期待dynamic添加function时,请参阅Docker Pull Request 8484 。

您可以提交您的现有容器,然后使用新的坐骑运行它。

例:

 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5a8f89adeead ubuntu:14.04 "/bin/bash" About a minute ago Exited (0) About a minute ago agitated_newton $ docker commit 5a8f89adeead newnameofcontainer $ docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newnameofcontainer /bin/bash 

如果一切正常,停止旧容器,并使用这个新的容器。

而已 :)

JérômePetazzoni有一篇关于如何在运行时将容器附加到容器的非常有趣的博客文章。 这不是Docker内置的东西,但可以完成。

他也指出

这不适用于不是基于块设备的文件系统。

只有/ proc / mounts正确列出块设备节点(正如我们上面所看到的,不一定是这样),它才会起作用。

另外,我只在我的本地环境中进行了testing。 我甚至没有尝试过一个云实例或类似的东西

因人而异

我们没有办法在运行容器中添加卷,但要达到这个目的,您可以使用下面的命令:

复制容器和本地文件系统之间的文件/文件夹: –

 docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH 

供参考请参阅:

https://docs.docker.com/engine/reference/commandline/cp/

不幸的是,安装一个卷的开关选项只能在run命令中find。

docker run --help

-v, --volume list Bind mount a volume (default [])

有一种方法可以解决这个问题,所以你不必重新安装你已经在你的容器上设置的应用程序。

  1. 导出您的容器docker container export -o ./myimage.docker mycontainer
  2. 导入为图像docker import ./myimage.docker myimage
  3. 然后docker run -i -t -v /somedir --name mycontainer myimage /bin/bash