在Docker容器上挂载多个卷?

251

我知道我可以使用类似以下命令将主机上的目录挂载到容器中:

docker run -t -i -v '/on/my/host:/on/the/container' ubuntu /bin/bash

是否有一种方法可以创建多个主机容器对?例如,使用逗号分隔的列表或传入一个数组?


据我理解当前文档术语的状态,您无法挂载卷(问题标题),但您确实可以拥有许多绑定挂载到主机文件夹(这是问题正文中所要求的)。 - Alex Martian
执行以下命令:docker run -t -i \ -v '/on/my/host/test1:/on/the/container/test1' \ -v '/on/my/host/test2:/on/the/container/test2' \ ubuntu /bin/bash - Charlie Parker
8个回答

386

传递多个-v参数。

例如:

docker -v /on/my/host/1:/on/the/container/1 \
       -v /on/my/host/2:/on/the/container/2 \
       ...

2
好的,我正在以完全相同的方式进行操作,但是当我尝试调用第二个时,它说找不到。 - momal
docker run -v /home/usr/workspace/proj/WebContent/file/username:/mycode -v /home/usr/workspace/proj/WebContent/file:/tst gcc:4.9 sh -c 'cd mycode; gcc -o myapp ./mycode.c; cd tst; ./myapp < ./test.txt'这是我的命令,我正在尝试编译第一个卷中的 mycode.c 文件,但要从另一个卷中给它相同的 stdin。我该如何做? - momal
它总是需要绝对路径吗? - xatzistnr
3
目的地必须始终是绝对路径。源路径必须是绝对路径或命名卷的标识符,详情请参见 https://docs.docker.com/engine/admin/volumes/volumes/。 - Charles Duffy
@CharlieParker,显式提供占位符“img_name:tag”和“cmd”违背了使用“...”作为“在此处填写所有其他参数”的标记的目的。 - Charles Duffy
显示剩余3条评论

63

Docker现在建议使用--mount进行迁移。

当前Docker文档中还详细解释了多个卷挂载的方法。

来自:https://docs.docker.com/storage/bind-mounts/

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  --mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave \
  nginx:latest

原来较旧的答案仍应该可行;只是尝试将答案与当前已知的最佳方法保持一致。


8
值得一提的是,Docker推荐迁移的唯一原因是他们的研究表明,--mount更易于使用并具有更多选项。 使用-v或--mount都是完全可以的,这取决于个人偏好和需求。 - KillerKode
docker run -v /Users/brandomiranda/iit-term-synthesis:/home/bot/iit-term-synthesis \ -v /Users/brandomiranda/pycoq:/home/bot/pycoq \ -v /Users/brandomiranda/ultimate-utils:/home/bot/ultimate-utils \ -ti brandojazz/iit-term-synthesis:test bash有什么问题? - Charlie Parker

34
您可以在docker run命令中多次使用-v选项,以在容器中挂载多个目录:
docker run -t -i \
  -v '/on/my/host/test1:/on/the/container/test1' \
  -v '/on/my/host/test2:/on/the/container/test2' \
  ubuntu /bin/bash

1
这是否对先前给出的同样效果的答案有所补充? - Charles Duffy
喜欢这个答案!有一个具体可执行的东西和一个有用的交互式演示。 - Charlie Parker

10
您可以在卷上只拥有只读或读写权限。
docker -v /on/my/host/1:/on/the/container/1:ro \

docker -v /on/my/host/2:/on/the/container/2:rw \

3
默认选项是哪一个? - Hammad Dar
@HammadDar 我很确定'rw'是卷的默认设置。你可以尝试在本地测试时不指定结尾处的':rw'或':ro'。 - lightbox142

3
在Windows操作系统中,如果您需要挂载两个目录E:\data\dev和E:\data\dev2,请使用以下命令:
docker run -v E:\data\dev:c:/downloads -v E:\data\dev2 c:/downloads2 -i --publish 1111:80 -P SomeBuiltContainerName:SomeLabel

0

提供一个可运行的示例:

docker run -v /Users/brandomiranda/iit-term-synthesis:/home/bot/iit-term-synthesis \
           -v /Users/brandomiranda/pycoq:/home/bot/pycoq \
           -v /Users/brandomiranda/ultimate-utils:/home/bot/ultimate-utils \
           -ti brandojazz/iit-term-synthesis:test bash

但首先要做:

docker pull brandojazz/iit-term-synthesis:test

0

我看到有人评论问读写或只读是否是默认选项;读写是默认选项。(发帖是因为我的声望不够,无法评论)

根据docker文档,运行以下命令:

docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest

然后使用 docker inspect devtest 命令并在输出的 "Mounts" 部分中查找 "RW" 选项:

"Mounts": [
    {
        "Type": "volume",
        "Source": "/var/lib/docker/volumes/myvol2/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

让我们看到默认选项允许卷既可读又可写。


要将您的音量设置为只读(再次参见官方文档),请在sourcedestination标签后添加readonly

docker run -d \
--name=nginxtest \
--mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
nginx:latest

运行 docker inspect nginxtest 命令并找到 "Mounts":
"Mounts": [
    {
        "Type": "volume",
        "Source": "/var/lib/docker/volumes/nginx-vol/_data",
        "Destination": "/usr/share/nginx/html",
        "Driver": "local",
        "Mode": "",
        "RW": false,
        "Propagation": ""
    }
],

(注:我不知道官方文档为什么会在目标目的地标签之间切换,但我工作的假设是它们可以互相使用。)

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Besworks

-11

或者你可以这样做

docker run -v /var/volume1 -v /var/volume2 DATA busybox true

4
这不是原帖作者想要的。这会在容器内创建一个卷,而不是将其绑定到主机上。 - Ioannis
11
你是对的,应该是:docker run -v /var/volume1:/container/volume1 -v /var/volume2:/container/volume2 DATA busybox true。 - Joost van der Laan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接