【问题标题】:In docker-compose, is it possible to reuse volume configuration between services?在 docker-compose 中,是否可以在服务之间重用卷配置?
【发布时间】:2019-06-26 01:34:16
【问题描述】:

我正在尝试使用类似于以下的设置:

version: '3.4'
x-my-volumes: &volumes
    - '../src:/var/www/src/:cached'
    - '../static:/var/www/static/:cached'
services:
  webserver:
    build: ./.docker/webserver
    volumes:
      - *volumes
      - './serverlogs/:/var/www/serverlogs/:delegated'
  node:
    build: ./.docker/node
    volumes:
      - *volumes

我在x-my-volumes 部分设置了“共享”卷,并给它一个“卷”锚点,我尝试在我的服务中使用它。不过,主要的是,这些服务除了共享的卷挂载之外还有其他卷挂载。这不起作用,在执行docker-compose up 时会出现诸如“contains an invalid type, it should be an array”之类的错误。

这对 docker-compose 可行吗?我意识到我可以在我的真实世界场景中复制和粘贴每个服务的卷安装,它有 10 多个服务和 10 多个卷,所以这是很多丑陋的重复。

【问题讨论】:

    标签: docker docker-compose yaml


    【解决方案1】:

    如果服务之间的卷数组完全相同,您可以这样做:

    version: '3.4'
    
    services:
      webserver:
        volumes: &volumes
          - one:one
          - two:two
    
      node:
        volumes: *volumes
    

    如果您希望在某些服务中扩展数组并向其添加元素,如 this GitHub issuethis StackOverflow question 所示,YAML 似乎不支持此操作。


    也许可以为您提供另一种考虑的方法(尽管我不确定它是否对您的用例有所帮助):

    在我的许多 docker compose 中,我定义了一个“基础”服务,然后我可以通过使用 YAML 合并,由其他服务继承该服务的某些属性。考虑这个例子:

    version: '3'
    
    services:
      bash:
        build: .
        entrypoint: /bin/bash
        <<: &default
          image: dannyben/borg-client
          volumes:
            - one:one
            - two:two
    
      init:
        <<: *default
        command: init -e repokey-blake2
    
      backup:
        <<: *default
        command: create --stats --progress ::initial-backup /borg/source
    

    使用这种方法,我可以以非常易读的方式表达复杂的 docker-compose 文件。

    【讨论】:

    • 是的,不幸的是,目前在 YAML 中似乎无法合并序列。不过,感谢您提供的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多