Допустимый файл docker-compose, который не развертывается как стек при использовании якорей yaml

#docker #docker-compose #docker-swarm

Вопрос:

Я провел рефакторинг некоторых файлов docker-compose, чтобы попытаться воспользоваться советом № 82 и решить проблему, для которой я не смог найти решение; Я надеюсь, что кто-нибудь сможет помочь.

Используя следующий разделенный пример test-compose.yml файла:

 version: '3'

x-test: amp;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, так и для стека?

Ответ №1:

Итак, здесь вас будут кусать две вещи:

Во-первых, развертывание стека docker зависит от указанной вами версии, поэтому вам необходимо строго указать допустимую версию компоновки, равную или превышающую ту функцию, которую вы пытаетесь использовать. Не уверен, когда была добавлена поддержка привязки, но она определенно работает, когда версия указана как «3.9».

Ваша следующая проблема заключается в том, что слияние неглубоко. В вашем примере это не проблема, потому x-test что содержит только один параметр, который уже имеет значение по умолчанию, но в более общем плане для обработки сложных случаев требуется что-то подобное:

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

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

Поскольку добавление «развернуть» на карту hello-world полностью переопределяет любую запись, заданную службой по умолчанию, для импорта дополнительных настроек ей требуется собственная привязка.

Комментарии:

1. Блестяще — спасибо! Я думал, что «3» будет достаточно. Я обновил локально, и он больше не выдает ошибку. Также было отмечено о неглубоком слиянии, и я тоже обновлю свой экземпляр prod.

2. Поля расширения на корневом уровне поддерживаются начиная с «3.7». Версия «3» равна «3.0».