如何向现有Docker容器中添加卷?

我有一个Docker容器,我只需要在Ubuntu上安装Docker,然后做:

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

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

exit

然后我想增加一个体积,并意识到这并不像我想象的那么简单。如果我使用sudo docker -v /somedir run ...,那么我最终会得到一个新的容器,所以我必须安装Java,并做我之前已经做过的事情,只是为了到达一个带有挂载卷的容器。

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

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

403964 次浏览

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

例子:

$ 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/somedir":/somedir newimagename /bin/bash

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

你也可以使用容器的名字提交它,例如:

docker commit agitated_newton newimagename

就是这样:)

杰罗姆Petazzoni有一篇关于如何在容器运行时将卷附加到容器的非常有趣的博客文章。这不是Docker内置的开箱即用的东西,但可以实现。

他还指出

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

只有当/proc/mounts正确地列出块设备节点时(正如我们上面看到的,这并不一定是真的),它才会工作。

而且,我只在本地环境中进行了测试;我甚至没有尝试云实例或类似的东西

YMMV

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

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

我们没有任何方法在运行的容器中添加容量,但为了达到这个目标,你可以使用下面的命令:

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

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH


docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

参考资料:

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

我已经成功地将主机的/home/<user-name>文件夹挂载到现有(未运行)容器的/mnt文件夹。你可以用以下方法来做:

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

  2. 找到MountPoints部分,在我的例子中是空的:"MountPoints":{}。接下来将内容替换为如下内容(你可以通过适当的设置从另一个容器复制适当的内容):

"MountPoints":{"/mnt":{"Source":"/home/<user-name>","Destination":"/mnt","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"/home/<user-name>","Target":"/mnt"},"SkipMountpointCreation":false}}

或相同(格式化):

  "MountPoints": {
"/mnt": {
"Source": "/home/<user-name>",
"Destination": "/mnt",
"RW": true,
"Name": "",
"Driver": "",
"Type": "bind",
"Propagation": "rprivate",
"Spec": {
"Type": "bind",
"Source": "/home/<user-name>",
"Target": "/mnt"
},
"SkipMountpointCreation": false
}
}
  1. 重启docker服务:service docker restart

这适用于我的Ubuntu 18.04.1和Docker 18.09.0

最好的方法是通过docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH复制本地文件系统目录中的所有文件和文件夹

SRC_PATH在容器上 DEST_PATH在localhost上

然后执行docker-compose down将卷附加到相同的DEST_PATH,并使用docker-compose up -d运行Docker容器

通过下面docker-compose.yml添加卷

volumes:
- DEST_PATH:SRC_PATH

在我不得不寻找这个问题很长一段时间后,使用Docker Windows容器的一个注意事项!

摘要:

  • Windows 10
  • Docker Desktop(最新版本)
  • 使用Docker Windows容器镜像microsoft/mssql-server-windows-developer

问题:

  • 我想挂载一个宿主字典到我的windows容器。

解决方案部分描述如下:

  • 创建docker容器

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer

  • 进入容器中的shell命令

docker exec -it <CONTAINERID> cmd.exe

  • 创建DIR

mkdir DirForMount

  • 停止容器

docker container stop <CONTAINERID>

  • 提交集装箱

docker commit <CONTAINERID> <NEWIMAGENAME>

  • 删除旧容器

docker container rm <CONTAINERID>

  • 创建带有新映像和卷挂载的新容器

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y -v C:\DirToMount:C:\DirForMount <NEWIMAGENAME>

在这之后,我解决了这个问题在docker窗口容器。

使用符号链接到已经挂载的驱动器:

ln -s Source_path targer_path_which_is_already_mounted_on_the_running_docker

我的答案会有所不同。您可以停止容器,添加卷并重新启动它。如何做,请按照步骤来做。

docker volume create ubuntu-volume
docker stop <container-name>
sudo docker run -i -t --mount source=ubuntu-volume,target=<target-path-in-container> ubuntu /bin/bash

您可以停止并删除容器,在启动脚本中追加现有卷,并从映像重新启动。如果已经存在的现有分区确实保留了数据,那么您应该不会遇到任何信息丢失的情况。这同样适用于Dockerfile和Docker composer。

eg (solr图像)。 (初始脚本)< / >强

#!/bin/sh
docker pull solr:8.5
docker stop my_solr
docker rm solr:8.5


docker create \
--name my_solr \
-v "/XXXX/docker/solr/solrdata":/var/solr \
-p 8983:8983 \
--restart unless-stopped \
--user 1000:1000 \
-e SOLR_HEAP=1g \
--log-opt max-size=10m \
--log-opt max-file=3 \
solr:8.5
docker cp /home/XXXX/docker/solr/XXXXXXXX.jar my_solr:/opt/solr/contrib/dataimporthandler-extras/lib
docker start my_solr

文件与第二卷

#!/bin/sh
docker pull solr:8.5
docker stop my_solr
docker rm solr:8.5


docker create \
--name my_solr \
-v "/XXXX/docker/solr/solrdata":/var/solr \
-v "/XXXX/backups/solr_snapshot_folder":/var/solr_snapshots \
-p 8983:8983 \
--restart unless-stopped \
--user 1000:1000 \
-e SOLR_HEAP=1g \
--log-opt max-size=10m \
--log-opt max-file=3 \
solr:8.5
docker cp /home/XXXX/docker/solr/XXXXXXXX.jar my_solr:/opt/solr/contrib/dataimporthandler-extras/lib
docker start my_solr