#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».