如何使用Docker' svolumes-from映射卷路径?

时间:2014-04-17 15:42:12

标签: docker

我是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

2 个答案:

答案 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版本。