Есть ли способ отключить службу в docker-compose.yml

91

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

Конечно, я мог бы это прокомментировать, но есть ли возможность просто сказать " enabled: false"?

Мандрагор
источник
4
Ответ: «это зависит» ... от того, чего вы пытаетесь достичь. Если вы запустите, docker-compose upон запустит все службы по умолчанию. Однако, если вы запустите, docker-compose up myserviceон запустит мою службу и все, что от нее зависит. Настроив зависимости, вы можете сделать так, чтобы плохая служба не запускалась с помощью этой команды. Вы также docker-compose runможете получить только те услуги, которые вам нужны. Правильный выбор также может заключаться в том, чтобы разбить его на несколько файлов для создания файлов, чтобы обеспечить необходимую гибкость.
Пол Бекотт
Чтобы справиться с подобной потребностью, я играю с зависимым_on и аргументом службы в docker-compose up или с опцией, --no-depsесли вы не хотите запускать зависимости. Я знаю, что это не то, что вы ищете, а наоборот.
Gonzalo
Другой вариант - создать столько файлов docker-compose, сколько вам нужно, и выбрать, какие из них вы хотите включать в свои вызовы docker-compose -f docker-compose.yml -f another-docker-compose.yml up -d. Вы можете проверить результирующее слияние docker compose с помощью команды config :docker-compose -f docker-compose.yml -f another-docker-compose.yml config
Gonzalo,
@EshaanBansal Я не знаю такой функции.
VonC

Ответы:

42

Вы можете просто переопределить entrypointилиcommand , чтобы заменить указанную команду чем-то, что ничего не делает ( /bin/true)

Это заставит контейнер немедленно выйти, ничего не делая.


Шади добавляет в комментарии следующие советы:

Если вы не хотите, чтобы служба собиралась вообще, переопределите ключ сборки, чтобы он указывал на то, Dockerfileчто имеет только:

FROM tianon/true 
ENTRYPOINT ["/true"]

5andr0 указывает в комментариях на раздел верхнего уровняx-disabled: (расширение, подобное полю)

Намного удобнее: перемещать отключенные службы в раздел верхнего уровня x-disabled:вместоservices:

Разделы с x-префиксом будут проанализированы, но игнорироваться, если не используются по назначению в качестве поля расширения.

VonC
источник
15
Я бы также добавил / изменил, restart: "no"чтобы избежать бесконечных перезапусков
DUzun
2
Это не помогает в том случае, если вы хотите отключить эту службу, потому что она даже не запускается. В моем случае postgres не запускается, потому что есть еще один экземпляр postgres, и команда ports вызывает конфликты. Я мог бы начать менять определение, но в этот момент проще все комментировать.
blueFast
1
Намного удобнее: перенос отключенных сервисов в раздел верхнего уровня x-disabled:вместоservices:
5andr0
@ 5andr0 Интересно. Есть ли документация для этого раздела docker-compose?
VonC
docs.docker.com/compose/compose-file/#extension-fields, представленный в v3.4. Разделы с префиксом x- будут проанализированы, но проигнорированы, если не используются по назначению в качестве поля расширения
5andr0
63

Вы можете сделать это в docker-compose.override.yamlфайле.

Этот файл автоматически считывается docker-composeи объединяется с основным docker-compose.yaml.

Если он исключен из Git, каждый разработчик может настроить конфигурацию (с некоторыми ограничениями), не изменяя исходную docker-compose.yaml.

Таким образом, сервис fooможно отключить ad-hoc, переопределив его точку входа в docker-compose.override.yaml:

version: "3"

services:
  foo:
    entrypoint: ["echo", "Service foo disabled"]
Кос, пров
источник
1
Если у вас есть «перезапуск: если не остановлен» и т. Д., Прокомментируйте это, или он будет постоянно перезапускаться
Андреас
Идея состоит в том, чтобы изменить точку входа в файле переопределения. Если у вас есть политики перезапуска, измените их на бесконечный цикл сна
Кос,
Чтобы уточнить, вы можете сделать это в docker-compose.yml, как в ответе VonC. Это было бы уместно, если вы хотите проверить это и поделиться с другими разработчиками. Кроме того, формат файла compose v1 принимает имена служб (foo в приведенном выше примере) как ключи верхнего уровня, а не подключи «services».
Денис Хоу
1
Это решение прекрасно работает, если вы хотите отключить / включить службу для конкретной среды (например, разработка / постановка / производство), где вы указали другой файл переопределения для каждой среды с параметром -f.
Джастин Эмери,
с docker-compose v3 мы можем использовать env для отключения службы, то есть: export XXX_ENTRYPOINT=/bin/true then `entrypoint: [" $ {XXX_ENTRYPOINT: -docker-entrypoint.sh} "]`
qxo
9

Я добавляю в службу, которую хочу временно отключить, следующую дополнительную строку:

command: echo "{put your service name here} disabled"

Он все равно запускается, но ничего не делает.

Мишель Минно
источник
6
Повторное определение commandне влияет на точку входа. В вашем примере вы полагаетесь , что entrypointэто bashя думаю. Чтобы сделать это устойчивым ((независимо от встроенного entrypoint), я думаю, вам нужно переопределить точку входа, а не команду.
blueFast
4

Невозможно отключить службу, определенную в файле Docker compose yaml. Предложение VonC - хороший обходной путь. Пожалуйста, смотрите ниже документацию по созданию докеров для доступных опций https://docs.docker.com/compose/compose-file/

Шибаши
источник
2

Я бы масштабировал службу до 0 реплик с помощью: deploy: replicas: 0

К сожалению, как указано в документации, это работает только с docker swarm.

ее
источник
-2

Я понял:

docker-compose up $(yq -r '.services | keys | join(" ")' docker-compose.yml | sed 's/service-name//')
CodeGuy
источник
Это происходит именно так, как я ожидал от запроса. Это не самый простой вариант, но он работает достаточно хорошо для моего случая, и я могу интегрировать его в некоторые из моих скриптов.
Билл Кидвелл
-9

Примитивно, но добавьте #в начало каждой строки службы.

Кьельд Фларуп
источник
3
Вопрос был об альтернативах комментированию услуги.
Michael Härtl