通过docker-compose文件版本“3”挂载主机目录并重新使用数据卷

时间:2017-02-07 10:05:09

标签: docker docker-compose

我有Docker命令来创建一个容器,然后使用该容器的名称与 - volumes-from 来运行另一个容器,它运行正常 -

docker create -v /home/dev/docker/my/config:/home/myuser/4.0/config --name shared-config my/configurator:4.0.0

以上内容将从图片 my / configurator:4.0.0

按名称 shared-config 创建一个新容器

当尝试运行任何其他容器(比如我的/ oms:4.0.0)时,我可以使用 - volumes-from

docker run --volumes-from shared-config -p 8083:8080 -d my/oms:4.0.0

使用 - volumes-from ,我们可以多次使用该卷,只需要容器。

直到这里一切似乎都很好。

现在,我正在尝试使用文件格式版本“3”在docker-compose中执行上述操作,并且无法理解如何在创建后重新使用数据卷。因为根据版本3中的docker-compose,它们具有discontinued use of --volumes-from。 他们说 -

  

要在服务之间共享卷,请使用顶级卷选项定义它,并使用服务级别卷选项从共享它的每个服务引用它。

在上述声明中,他们指的是命名卷,请参阅here

但我只是想将主机目录挂载为数据卷并重新使用该数据卷。我的问题是如何通过docker-compose文件版本“3”重用此数据卷。 最简单的是,对于我想通过docker-compose运行的每个服务,我可以在服务级别使用卷密钥

version: "3"
services:
  my-oms:
    image: my/oms:4.0.0
    ports:
      - "8083:8080"
    volumes:
      - /home/dev/docker/my/config:/home/myuser/4.0/config

但是,如果我想将主机的目录(/ home / dev / docker / my / config)用作不同服务中的数据卷,该怎么办?我是否应该为每个服务提供音量键,或者实际上在docker-compose版本“3”中有更好的方法,我可以在其他服务中重新使用数据量(我们如何使用--volumes-from)。 / p>

我错过了任何指针或建议或什么?

1 个答案:

答案 0 :(得分:4)

避免重复语法的最佳选择是使用extends option扩展docker-compose.yml:

所以你可以拥有一个看起来像这样的common-services.yml:

version: "3"
services:
  generic-vol:
    volumes:
      - /home/dev/docker/my/config:/home/myuser/4.0/config

然后您的docker-compose.yml更新为:

version: "3"
services:
  my-oms:
    extends:
      file: common-services.yml
      service: generic-vol
    image: my/oms:4.0.0
    ports:
      - "8083:8080"

请注意,docker stack deploy -c docker-compose.yml可能不支持所有这些选项,我在项目中使用变量和多个docker-compose文件时遇到了问题。解决方案是使用docker-compose将文件解析为堆栈部署可以与docker-compose config >docker-compose.stack.yml一起使用的东西,然后将该yml文件传递给堆栈部署。

第二种选择是利用yml语法本身的功能。它允许锚点和对这些锚点的引用。该语法如下:

version: "3"
services:
  my-oms:
    image: my/oms:4.0.0
    ports:
      - "8083:8080"
    volumes: &common-vol
      - /home/dev/docker/my/config:/home/myuser/4.0/config
  my-xyz:
    image: my/xyz:4.0.0
    ports:
      - "8888:8080"
    volumes: *common-vol

第一个&common-vol创建一个锚点,后一个*common-vol是对yml数据的同一部分的引用。