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

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

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

exit

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

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

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


当前回答

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

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 

其他回答

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

ln -s Source_path targer_path_where_is_already_mounted_on_the_running_docker

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

码头工人跑——救命

-v,——volume list绑定挂载卷(默认[])

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

导出容器 Docker容器导出-o ./myimage。码头工人mycontainer 作为图像导入 Docker导入。/myimage。码头工人模板 然后docker运行-i -t -v /somedir——name mycontainer myimage /bin/bash

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

SRC_PATH在容器上 DEST_PATH在本地主机上

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

在docker-compose.yml中添加卷

volumes:
 - DEST_PATH:SRC_PATH

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

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

他还指出

这将不适用于非基于块设备的文件系统。 只有当/proc/mounts正确地列出块设备节点时(正如我们上面看到的,这并不一定是真的),它才会工作。 而且,我只在本地环境中进行了测试;我甚至没有尝试云实例或类似的东西

YMMV