【问题标题】:How to map volume paths using Docker's --volumes-from?如何使用 Docker 的 --volumes-from 映射卷路径?
【发布时间】:2014-06-01 23:38:02
【问题描述】:

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

【问题讨论】:

  • 这有 github 问题吗?会很有用的
  • @Anentropic 我还没有创建一个。
  • 看起来@Anentropic 创建了问题github.com/docker/docker/issues/11261,但它已被吸收到其他与卷相关的工作中。

标签: docker


【解决方案1】:

可以,但是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 时所做的相同。

【讨论】:

  • 注意:如果您像这样从 DATA1 绑定卷,则在删除 DATA1 容器后,卷将在 docker rm -v DATA1docker volume prune 上删除。
  • 还没实现?我们在 2018 年 :-)
【解决方案2】:

为了完整性...

#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

“--volumes-from=container”只是映射文件系统,例如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 版本。

【讨论】:

  • 注意:使用 docker .1.8,.Volumes "/srv" 将为空:请参阅 stackoverflow.com/a/31997267/6309
  • 由于“Mount”现在也有一个“Driver”条目,所以似乎卷驱动程序正在实施......所以假设卷可以通过本地文件访问可能不安全系统很久了。所以不要在第二步中更改路径,在第一步中将其映射到您想要的位置。这几乎就是 Docker 的做事方式……您无需更改正在运行的容器,而是将其丢弃并开始一个新容器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多