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

Sau*_*abh 3 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
Run Code Online (Sandbox Code Playgroud)

上面将创建一个名为共享配置的新容器镜像my/configurator:4.0.0

当尝试运行任何其他容器(例如 my/oms:4.0.0)时,我可以使用 --volumes -from简单地使用名为共享配置的容器中的卷

docker run --volumes-from shared-config -p 8083:8080 -d my/oms:4.0.0
Run Code Online (Sandbox Code Playgroud)

使用--volumes-from我们可以在需要的容器中多次使用该卷。

到这里一切似乎都很好。

现在,我尝试使用文件格式版本“3”在 docker-compose 中执行上述操作,但无法理解创建后如何重新使用数据卷。由于按照版本 3 中的 docker-compose,他们已停止使用--volumes-from。他们说 -

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

在上面的声明中,他们指的是命名卷,请从这里参考参考。

但我只想将主机目录挂载为数据卷并重新使用该数据卷。我的问题是如何通过 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
Run Code Online (Sandbox Code Playgroud)

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

有什么指示或建议或我错过的东西吗?

BMi*_*tch 5

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

因此,您可以拥有一个如下所示的 common-services.yml:

version: "3"
services:
  generic-vol:
    volumes:
      - /home/dev/docker/my/config:/home/myuser/4.0/config
Run Code Online (Sandbox Code Playgroud)

然后你的 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"
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)

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