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

How can I add a volume to an existing Docker container?

我有一个Docker容器,我只是通过在Ubuntu上安装Docker并执行以下操作创建的:

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

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

1
exit

然后我想增加一卷,意识到这并不像我想象的那么简单。如果我使用EDCOX1,0,那么我会得到一个新的容器,所以我会安装Java,然后做我已经做过的事情,然后到达一个带安装卷的容器。

有关从主机装载文件夹的所有文档似乎都暗示了在创建容器时可以装载卷。因此,我必须避免从头重新配置新容器的唯一选项是将现有容器提交到存储库,并在装载卷时将其用作新容器的基础。

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


您可以提交现有的容器(即根据容器的更改创建新的映像),然后使用新的装载运行它。

例子:

1
2
3
4
5
6
7
$ 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 newimagename

$ docker run -ti -v"$PWD/dir1":/dir1 -v"$PWD/dir2":/dir2 newimagename /bin/bash

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

就是这样:


我们没有任何方法可以在运行的容器中添加卷,但是为了实现这一目标,您可以使用以下命令:

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

1
2
3
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

有关参考,请参见:

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


杰尔?Me Petazzoni有一篇非常有趣的博客文章,关于如何在卷运行时将其附加到容器上。这不是Docker现成的内置功能,而是可以实现的。

正如他指出的那样

This will not work on filesystems which are not based on block devices.

It will only work if /proc/mounts correctly lists the block device node (which, as we saw above, is not necessarily true).

Also, I only tested this on my local environment; I didn’t even try on a cloud instance or anything like that

牛传染性胃肠炎病毒


不幸的是,装载卷的开关选项只在run命令中找到。

docker run --help

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

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

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

  • 我已经成功地将主机的/home/文件夹安装到现有(未运行)容器的/mnt文件夹中。您可以按以下方式执行:

  • 打开与停止的容器对应的配置文件,可在/var/lib/docker/containers/99d...1fb/config.v2.json找到(对于老版本的docker,可以是config.json)。

  • 找到MountPoints部分,在我的例子中是空的:"MountPoints":{}部分。接下来,将内容替换为类似的内容(您可以使用适当的设置从另一个容器复制适当的内容):

    "MountPoints":{"/mnt":{"Source":"/home/","Destination":"/mnt","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"/home/","Target":"/mnt


    The best way is to copy all the files and folders inside a directory on your local file system by: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

    SRC_PATH在集装箱上DEST_PATH在本地主机上

    然后在同一个DEST_PATH上附加一个卷,使用docker-compose up -d运行docker容器。

    docker-compose.yml中按以下方式增加音量

    1
    2
    volumes:
     - DEST_PATH:SRC_PATH