Czy istnieje sposób na wyłączenie usługi w docker-compose.yml

91

Znajduję się w sytuacji, w której chcę tymczasowo wyłączyć usługę w pliku docker-compose pliku.

Oczywiście mógłbym to skomentować, ale czy jest jakaś opcja, aby po prostu powiedzieć „ enabled: false”?

Mandragor
źródło
4
Odpowiedź brzmi: „to zależy”… od tego, co próbujesz osiągnąć. Jeśli uruchomisz docker-compose up, domyślnie uruchomi wszystkie usługi. Jeśli jednak uruchomisz docker-compose up myservice, uruchomi się moja usługa i rzeczy od niej zależne. Konfigurując zależności, możesz sprawić, że zła usługa nie rozpocznie się od tego polecenia. Możesz także docker-compose runskorzystać z usług, które chcesz. Właściwym wyborem może być również podzielenie tego na wiele plików redagowania, aby zapewnić potrzebną elastyczność.
Paul Becotte
Aby zaspokoić podobną potrzebę, gram z depend_on i argumentem service w docker-compose up lub opcją --no-depsna wypadek, gdybyś nie chciał uruchamiać zależności. Wiem, że to nie jest to, czego szukasz, ale jest na odwrót.
Gonzalo,
Inną opcją jest utworzenie dowolnej liczby plików docker-compose i wybranie, które z nich chcesz uwzględnić w połączeniach docker-compose -f docker-compose.yml -f another-docker-compose.yml up -d. Możesz sprawdzić wynikowe połączenie Docker Compose za pomocą polecenia config :docker-compose -f docker-compose.yml -f another-docker-compose.yml config
Gonzalo,
Czy to odpowiada na twoje pytanie? Czy możesz zdefiniować opcjonalne usługi docker-compose?
Eshaan Bansal
@EshaanBansal Nie znam takiej funkcji.
VonC

Odpowiedzi:

42

Możesz po prostu przedefiniować entrypointlubcommand , aby zastąpić to polecenie czymś, co nic nie robi ( /bin/true)

To spowodowałoby natychmiastowe opuszczenie kontenera, nic nie robiąc.


shadi dodaje w komentarzach następujące wskazówki:

Jeśli nie chcesz, aby usługa w ogóle była budowana, przedefiniuj klucz kompilacji, tak aby wskazywał Dockerfiletylko na:

FROM tianon/true 
ENTRYPOINT ["/true"]

5andr0 zwraca uwagę w komentarzach do sekcji najwyższego poziomux-disabled: (pole-jak rozszerzenie)

O wiele wygodniejsze: przenoszenie wyłączonych usług do sekcji najwyższego poziomu x-disabled:zamiastservices:

Sekcje z x-prefiksem zostaną przeanalizowane, ale zignorowane, jeśli nie zostaną użyte w zamierzony sposób jako pole rozszerzenia.

VonC
źródło
15
Chciałbym również dodać / zmienić, restart: "no"aby uniknąć nieskończonych
ponownych
2
Nie pomaga to w przypadku, gdy powodem, dla którego chcesz wyłączyć tę usługę, jest to, że usługa nie może się nawet uruchomić. W moim przypadku postgres nie uruchamia się, ponieważ jest uruchomiona inna instancja postgres, a polecenie portów powoduje konflikty. Mógłbym zacząć zmieniać definicję, ale w tym momencie skomentowanie całej sprawy jest łatwiejsze.
blueFast
1
O wiele wygodniejsze: przeniesienie wyłączonych usług do sekcji najwyższego poziomu x-disabled:zamiastservices:
5andr0
@ 5andr0 Ciekawe. Czy istnieje dokumentacja dla tej sekcji docker-compose?
VonC
docs.docker.com/compose/compose-file/#extension-fields wprowadzone w wersji 3.4. Sekcje z prefiksem x- zostaną przeanalizowane, ale zignorowane, jeśli nie zostaną użyte w zamierzony sposób jako pole rozszerzenia
5andr0
63

Możesz to zrobić w docker-compose.override.yamlpliku.

Ten plik jest automatycznie odczytywany docker-composei scalany z plikiem głównym docker-compose.yaml.

Jeśli masz go wykluczone z Git, każdy programista może dostosować konfigurację (z kilkoma ograniczeniami) bez zmiany oryginału docker-compose.yaml.

Tak więc usługę foomożna wyłączyć ad hoc, ponownie definiując jej punkt wejścia w docker-compose.override.yaml:

version: "3"

services:
  foo:
    entrypoint: ["echo", "Service foo disabled"]
Kos Prov
źródło
1
Jeśli masz komunikat „restart: chyba że zatrzymano” itp., Skomentuj to, albo będzie się ciągle uruchamiać ponownie
Andreas,
Pomysł polega na zmianie punktu wejścia w pliku przesłonięcia. Jeśli masz zasady dotyczące restartu, zmień je na nieskończoną pętlę snu
Kos Prov,
Aby wyjaśnić, możesz to zrobić w docker-compose.yml, tak jak w odpowiedzi VonC. Byłoby to odpowiednie, jeśli chcesz to sprawdzić i udostępnić innym programistom. Ponadto format pliku Compose v1 akceptuje nazwy usług (foo w powyższym przykładzie) jako klucze najwyższego poziomu, a nie podklucze „usług”.
Denis Howe
1
To rozwiązanie działa dobrze, jeśli chcesz wyłączyć / włączyć usługę dla określonego środowiska (np. Programowanie / przemieszczanie / produkcja), w którym określono inny plik nadpisania dla każdego środowiska z opcją -f.
Justin Emery
z docker-compose v3 możemy użyć env do wyłączenia usługi, tj .: export XXX_ENTRYPOINT=/bin/true then `entrypoint: [" $ {XXX_ENTRYPOINT: -docker-entrypoint.sh} "]`
qxo
9

Dodaję następującą dodatkową linię do usługi, którą chcę tymczasowo wyłączyć:

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

Zaczyna się i tak, ale nic nie robi.

Michele Minno
źródło
6
Ponowne zdefiniowanie commandnie ma wpływu na punkt wejścia. W swoim przykładzie polegasz na tym, że tak entrypointjest bash. Aby uczynić to elastycznym ((niezależnie od wbudowanego entrypoint), myślę, że musisz przedefiniować punkt wejścia, a nie polecenie.
blueFast
4

Nie ma możliwości wyłączenia usługi zdefiniowanej w pliku YAML Compose Docker. Sugestia VonC to dobre obejście. Zobacz poniżej dokumentację docker compose dla dostępnych opcji https://docs.docker.com/compose/compose-file/

Shibashis
źródło
-2

Mam to:

docker-compose up $(yq -r '.services | keys | join(" ")' docker-compose.yml | sed 's/service-name//')
CodeGuy
źródło
Robi to dokładnie tak, jak oczekiwałem od prośby. Nie jest to najłatwiejsze do zrozumienia, ale działa wystarczająco dobrze w moim przypadku i mogę go zintegrować z niektórymi z moich skryptów.
Bill Kidwell
-9

Prymityw, ale dodaj #na początku każdego wiersza usługi.

Kjeld Flarup
źródło
3
Pytanie dotyczyło alternatyw dla komentowania usługi.
Michael Härtl