有效 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 地图完全覆盖了默认服务设置的任何条目,因此它需要自己的锚点引用来导入子设置。
我一直在重构一些 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 地图完全覆盖了默认服务设置的任何条目,因此它需要自己的锚点引用来导入子设置。