有效 docker-compose 文件在使用 yaml 锚点时未部署为堆栈

Valid docker-compose file not deploying as stack when using yaml anchors

我一直在重构一些 docker-compose 文件以尝试利用 tip #82 并遇到一个我无法找到解决方案的问题;我希望有人能提供帮助。

使用以下剥离示例 test-compose.yml 文件:

version: '3'

x-test: &test
  deploy:
    mode: replicated

services:
  hello-world:
    <<: *test
    image: alpine
    command: ["ping", "www.google.com"]
    deploy:
      replicas: 2

运行 在 docker-compose 下按预期工作:

root@docker01:~# docker-compose -f test-compose.yml up
Recreating root_hello-world_1 ... done
Recreating root_hello-world_2 ... done
Attaching to root_hello-world_2, root_hello-world_1
hello-world_1  | PING www.google.com (172.217.16.228): 56 data bytes
hello-world_1  | 64 bytes from 172.217.16.228: seq=0 ttl=114 time=6.704 ms
hello-world_2  | PING www.google.com (172.217.16.228): 56 data bytes
hello-world_2  | 64 bytes from 172.217.16.228: seq=0 ttl=114 time=6.595 ms

然而启动与堆栈相同,失败:

root@docker01:~# docker stack deploy --compose-file test-compose.yml hello-world
(root) Additional property x-test is not allowed

有没有办法让相同的扩展(“x-* 属性)同时适用于 docker-compose 和堆栈?

所以,有两件事会困扰您:

首先,docker stack deploy 对您指定的版本很挑剔,因此您需要严格指定等于或高于您尝试使用的功能的有效撰写版本。不确定何时添加锚点支持,但当版本指定为“3.9”时它肯定有效。

你的下一个问题是合并很浅。在您的示例中,这不是问题,因为 x-test 仅包含一个已经处于默认值的设置,但更一般地说,要处理复杂的情况,需要这样的设置:

version: "3.9"
x-defaults:
  service: &service-defaults
    deploy: &deploy-defaults
      placement:
        constraints:
        - node.role==worker

services:
  hello-world:
    <<: *service-defaults
    image: alpine
    deploy:
      <<: *deploy-defaults
      replicas: 2

由于将“部署”添加到 hello-world 地图完全覆盖了默认服务设置的任何条目,因此它需要自己的锚点引用来导入子设置。