我是Docker的新手,对使用--volumes-from
功能感到很兴奋,但有些事我不理解。
如果我想将--volumes-from
与两个仅限数据的容器一起使用,每个容器都导出名为/srv
的卷,如何防止卷路径冲突?我可以使用[host-dir]:[container-dir]
创建绑定装载时映射卷名称;我如何使用--volumes-from
?
所以我想要的东西会是这样的:
docker run --name=DATA1 --volume=/srv busybox true
docker run --name=DATA2 --volume=/srv busybox true
docker run -t -i -rm --volumes-from DATA1:/srv1 --volumes-from DATA2:/srv2 ubuntu bash
答案 0 :(得分:40)
可以这样做,但目前在docker命令行界面中不支持它。
查找卷目录:
docker inspect DATA1 | grep "vfs/dir"
# output something like:
# "/srv": "/var/lib/docker/vfs/dir/<long vol id>"
因此,您可以自动执行此操作,并将这些目录挂载到您选择的挂载点:
# load directories in variables:
SRV1=$(docker inspect DATA1 | grep "vfs/dir" | awk '/"(.*)"/ { gsub(/"/,"",$2); print $2 }')
SRV2=$(docker inspect DATA2 | grep "vfs/dir" | awk '/"(.*)"/ { gsub(/"/,"",$2); print $2 }')
现在,通过真实目录而不是--volumes-from:
安装这些卷docker run -t -i -v $SRV1:/srv1 -v $SRV2:/srv2 ubuntu bash
IMO,功能相同,因为这与使用--volumes-from
时的功能相同。
答案 1 :(得分:3)
为了完整......
#create data containers
docker run --name=d1 -v /svr1 busybox sh -c 'touch /svr1/some_data'
docker run --name=d2 -v /svr2 busybox sh -c 'touch /svr2/some_data'
# all together...
docker run --rm --volumes-from=d1 --volumes-from=d2 busybox sh -c 'find -name some_data'
# prints:
# ./svr2/some_data
# ./svr1/some_data
# cleanup...
docker rm -f d1 d2
&#34; - volumes-from = 容器&#34;只需映射文件系统,如mount --bind
如果你想改变路径,Jiri的回答(目前)是唯一的方法。 但是如果您处于有限的环境中,您可能希望使用内置检查解析功能的docker:
# create data containers
docker run --name=DATA1 --volume=/srv busybox sh -c 'touch /srv/some_data-1'
docker run --name=DATA2 --volume=/srv busybox sh -c 'touch /srv/some_data-2'
# run with volumes and show the data
docker run \
-v $(docker inspect -f '{{ index .Volumes "/srv" }}' DATA1):/srv1 \
-v $(docker inspect -f '{{ index .Volumes "/srv" }}' DATA2):/srv2 \
--rm busybox sh -c 'find -name some_data-*'
# prints:
# ./srv2/some_data-2
# ./srv1/some_data-1
# ditch data containers...
docker rm -f DATA1 DATA2
这甚至可能适用于boot2docker附带的旧bash版本。