我有一个Docker容器,我只是通过在Ubuntu上安装Docker并执行以下操作创建的:
1
| sudo docker run -i -t ubuntu /bin/bash |
我立即开始安装Java和其他一些工具,花一些时间,并停止容器。
然后我想增加一卷,意识到这并不像我想象的那么简单。如果我使用EDCOX1,0,那么我会得到一个新的容器,所以我会安装Java,然后做我已经做过的事情,然后到达一个带安装卷的容器。
有关从主机装载文件夹的所有文档似乎都暗示了在创建容器时可以装载卷。因此,我必须避免从头重新配置新容器的唯一选项是将现有容器提交到存储库,并在装载卷时将其用作新容器的基础。
这确实是向现有容器添加卷的唯一方法吗?
- 在容器之后,这些就成为了程序员不可分割的一部分,因此这些问题在这里发布的频率更高。这里使用docker标签发布的问题是34k+,比这两个站点stackoverflow.com/questions/tagged/docker都多。
您可以提交现有的容器(即根据容器的更改创建新的映像),然后使用新的装载运行它。
例子:
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 |
如果一切正常,停止你的旧容器,使用这个新的。
就是这样:
- 如果出于某种原因需要新容器使用旧名称,请在删除旧名称后使用docker rename。
- 只是想指出上面提到newnameofcontainer的地方,它可能应该被命名为new_image_name,因为docker commit在您的系统上创建了一个新的映像。然后,在下面的操作中,当您执行docker run时,实际上使用了要从中运行新容器的映像的名称。上面的工作,但只是想向其他人澄清,上面的占位符newnameofcontainer实际上是新图像的名称。谢谢!答案很棒。哦,您可以从使用docker image ls的第一个docker commit命令中看到新创建的映像。
- 实际上,如果您想从一个映像开始,就不需要提交一个新的容器。只有docker run -v /srv/a:/tmp ubuntu:14.04是好的。
- 我已经有一个容器运行所有文件。如果上面的方法创建了新的容器,我就不能再次构建所有内容。有没有一种方法可以避免这种情况并在不创建新容器或图像的情况下进行装载?
- 这将保留旧容器中的旧卷映射,还是应该使用新容器重新声明它们?
- @永好湖好主意!但是把它放在/tmp里不危险吗?也就是说,当你停止集装箱时,里面的东西会被擦干净?
我们没有任何方法可以在运行的容器中添加卷,但是为了实现这一目标,您可以使用以下命令:
在容器和本地文件系统之间复制文件/文件夹:
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网站/
- 装载卷和复制文件到容器和从容器复制文件之间有很大的区别…
- 不管怎样,它帮助了我。我不知道"docker 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。
- fyi-docker container不是1.11.2上的有效命令(这是本文撰写时Synology支持的最新版本)。但是,我找不到任何文档在添加时说。在这种情况下,第一个命令是docker export -o ./myimage.docker mycontainer。
我已经成功地将主机的/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
- 谢谢你的回答。步骤3至关重要。我还要补充一点,在写之前最好先停止Docker容器。
- 这是最好的答案,因为它完全保留了现有的容器。这就是我所做的:1.停止docker引擎:systemctl stop docker.service2。编辑config.v2.json:vim <(jq . /var/lib/docker/containers//config.v2.json)3。将更新保存到文件::w config.v2.json4。出口VIM::q!5。更新现有文件:jq -c . config.v2.json > /var/lib/docker/containers//config.v2.json6。启动docker引擎:systemctl start docker.service7。必要时启动容器:docker start 8。享受:-
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 |