我有一个Docker容器,我只是通过在Ubuntu上安装Docker并创建:
sudo docker run -i -t ubuntu /bin/bash
Run Code Online (Sandbox Code Playgroud)
我立即开始安装Java和其他一些工具,花一些时间用它来停止容器
exit
Run Code Online (Sandbox Code Playgroud)
然后我想添加一个卷,并意识到这并不像我想象的那么简单.如果我使用sudo docker -v /somedir run ...
那么我最终得到一个新的容器,所以我已经安装了Java并且做了我之前已经完成的工作,只是为了到达一个装有卷的容器.
有关从主机安装文件夹的所有文档似乎都暗示在创建容器时可以安装卷.因此,我必须避免从头开始重新配置新容器的唯一选择是将现有容器提交到存储库,并在安装卷时将其用作新容器的基础.
这确实是向现有容器添加卷的唯一方法吗?
Leo*_*ejo 317
您可以提交现有容器(即从容器的更改创建新映像),然后使用新安装运行它.
例:
$ 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
Run Code Online (Sandbox Code Playgroud)
如果一切正常,请停止旧容器,并使用这个新容器.
而已 :)
use*_*364 67
我们没有办法在运行容器中添加卷,但为了达到这个目的,您可以使用以下命令:
在容器和本地文件系统之间复制文件/文件夹: -
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Run Code Online (Sandbox Code Playgroud)
供参考:
https://docs.docker.com/engine/reference/commandline/cp/
Igo*_*rup 15
我已成功将/home/<user-name>
主机的/mnt
文件夹安装到现有(未运行)容器的文件夹中。您可以通过以下方式进行操作:
打开与停止的容器相对应的配置文件,该文件可以在上找到/var/lib/docker/containers/99d...1fb/config.v2.json
(可能config.json
适用于旧版本的docker)。
查找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
}
}
Run Code Online (Sandbox Code Playgroud)
service docker restart
这对我适用于Ubuntu 18.04.1和Docker 18.09.0
R0M*_*RMY 12
JérômePetazzoni有一篇非常有趣的博客文章,介绍如何在容器运行时将卷附加到容器中.这不是开箱即用的Docker内置的东西,但可以实现.
正如他也指出的那样
这不适用于不基于块设备的文件系统.
它只有在/ proc/mounts正确列出块设备节点时才会起作用(正如我们上面所看到的那样,它不一定是真的).
另外,我只在我当地的环境中测试过这个; 我甚至没有试过云实例或类似的东西
因人而异
不幸的是,只能在run
命令中找到安装卷的switch选项.
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
找这个问题找了半天后使用Docker Windows容器的一个注意事项!
条件:
问题:
此处部分描述的解决方案:
docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer
docker exec -it <CONTAINERID> cmd.exe
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 windows 容器上解决了这个问题。
归档时间: |
|
查看次数: |
178242 次 |
最近记录: |