Чи є спосіб вимкнути службу в docker-compose.yml


84

Я потрапляю в ситуацію, що хочу тимчасово вимкнути службу у docker-composeфайлі.

Звичайно, я міг би це прокоментувати, але чи є варіант просто сказати " enabled: false"?


3
Відповідь: "це залежить" ... від того, що ви намагаєтесь досягти. Якщо запустити, docker-compose upвін запустить усі служби за замовчуванням. Однак, якщо ви запустите, docker-compose up myserviceце запустить мою послугу та речі, які від цього залежать. Налаштувавши залежності, ви можете зробити так, щоб погана служба не запускалася з цієї команди. Ви також можете зробити, docker-compose runщоб отримати лише потрібні послуги. Правильним вибором може бути також розбиття цього на кілька файлів для складання, щоб забезпечити необхідну гнучкість.
Пол Бекотт,

Для того, щоб впоратися з подібною потребою, яка була у мене, я граю з depend_on та аргументом служби в docker-compose up , або опцією, --no-depsякщо ви не хочете запускати залежності. Я знаю, це не те, що ви шукаєте, а навпаки.
Гонсало

Інший варіант - створити стільки файлів для складання докерів, скільки вам потрібно, і вибрати, який із них ви хочете включити у свої дзвінки docker-compose -f docker-compose.yml -f another-docker-compose.yml up -d. Ви можете перевірити отримане об’єднання докера за допомогою команди config :docker-compose -f docker-compose.yml -f another-docker-compose.yml config
Гонсало,


@EshaanBansal Я не знаю такої функції.
VonC

Відповіді:


40

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

Це призведе до негайного виходу контейнера, нічого не роблячи.


shadi додає наступні поради в коментарях:

Якщо ви взагалі не хочете, щоб служба будувалася, перевизначте ключ побудови, щоб вказати на Dockerfileте, що має лише:

FROM tianon/true 
ENTRYPOINT ["/true"]

5andr0 зазначає у коментарях розділ верхнього рівняx-disabled: (подібно до поля розширення)

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

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


14
Я б також додав / змінив, restart: "no"щоб уникнути нескінченних перезапусків
DUzun

2
Це не допомагає у тому випадку, якщо причиною того, що ви хочете відключити цю службу, є те, що вона навіть не може запуститися. У моєму випадку я postgres не запускається, оскільки працює інший екземпляр postgres, і команда ports викликає конфлікти. Я міг би почати змінювати визначення, але на той момент коментувати все це простіше.
синій Швидкий

1
Набагато зручніше: переміщення служб з обмеженими можливостями до розділу верхнього рівня x-disabled:замістьservices:
5andr0

@ 5andr0 Цікаво. Чи існує документація для цього розділу створення докера?
VonC

docs.docker.com/compose/compose-file/#extension-fields, представлений у v3.4. Розділи з префіксом x- будуть проаналізовані, але проігноровані, якщо їх не використовувати за призначенням як поле розширення
5andr0

55

Ви можете зробити це у docker-compose.override.yamlфайлі.

Цей файл автоматично зчитується docker-composeта об’єднується в основний docker-compose.yaml.

Якщо його виключити з Git, кожен розробник може налаштувати конфігурацію (з деякими обмеженнями), не змінюючи оригінал docker-compose.yaml.

Отже, послугу fooможна відключити спеціально, перевизначивши її точку входу в docker-compose.override.yaml:

version: "3"

services:
  foo:
    entrypoint: ["echo", "Service foo disabled"]

1
Якщо у вас є "перезапуск: якщо не зупинено" тощо, прокоментуйте це, або воно буде постійно перезапускатися
Андреас,

Ідея полягає в тому, щоб змінити точку входу у файлі заміни. Якщо у вас є правила перезапуску, змініть його на нескінченний цикл сну
Kos Prov

Для уточнення ви можете зробити це в docker-compose.yml, як у відповіді VonC. Це було б доречно, якщо ви хочете перевірити його та поділитися ним з іншими розробниками. Крім того, формат файлу композиції v1 приймає імена служб (foo у наведеному вище прикладі) як ключі верхнього рівня, а не підрозділи "послуги".
Денис Хоу,

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"

Це все одно починається, але нічого не робить.


5
Повторне визначення commandзначення не впливає на точку входу. У вашому прикладі ви покладаєтесь на те, що entrypointце, bashя думаю. Щоб зробити цю стійку ((незалежно від вбудованої entrypoint), я думаю, вам потрібно перевизначити точку входу, а не команду.
blueFast

4

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


2

Я б масштабував службу до 0 реплік за допомогою: deploy: replicas: 0

На жаль, як зазначено в документації, це працює лише з докер-роєм.


-2

Зрозумів:

docker-compose up $(yq -r '.services | keys | join(" ")' docker-compose.yml | sed 's/service-name//')

Це відбувається саме так, як я очікував від запиту. Це не найпростіший пошук, але він працює досить добре для мого випадку, і я можу інтегрувати його в деякі зі своїх сценаріїв.
Білл Кідвелл

-6

Примітивний, але додайте a #на початку кожного рядка послуги.


3
Питання було про альтернативи коментування послуги.
Michael Härtl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.