Gibt es eine Möglichkeit, einen Dienst in docker-compose.yml zu deaktivieren?

84

Ich befinde mich in der Situation, dass ich einen Dienst vorübergehend in einer docker-composeDatei deaktivieren möchte .

Natürlich könnte ich es auskommentieren, aber gibt es eine Möglichkeit, einfach " enabled: false" zu sagen ?

Mandragor
quelle
3
Die Antwort lautet: "Es kommt darauf an" ... von dem, was Sie erreichen wollen. Wenn Sie ausführen docker-compose up, werden standardmäßig alle Dienste gestartet. Wenn Sie es jedoch ausführen docker-compose up myservice, wird myservice und Dinge, die davon abhängen, gestartet. Durch Einrichten der Abhängigkeiten können Sie festlegen, dass der fehlerhafte Dienst nicht mit diesem Befehl beginnt. Sie können auch docker-compose runnur die gewünschten Dienste in Anspruch nehmen. Die richtige Wahl kann auch darin bestehen, diese in mehrere Erstellungsdateien aufzuteilen, um Ihnen die Flexibilität zu ermöglichen, die Sie benötigen.
Paul Becotte
Um einen ähnlichen Bedarf zu bewältigen, spiele ich mit abhängigen_on und dem Dienstargument in Docker-Compose Up oder der Option, --no-depsfalls Sie die Abhängigkeiten nicht starten möchten. Ich weiß, es ist nicht das, wonach Sie suchen, aber es ist umgekehrt.
Gonzalo
Eine andere Möglichkeit besteht darin, so viele Docker-Compose-Dateien zu erstellen, wie Sie benötigen, und auszuwählen, welche davon Sie in Ihre Anrufe aufnehmen möchten docker-compose -f docker-compose.yml -f another-docker-compose.yml up -d. Sie können die resultierende Zusammenstellung der Docker-Komposition mit dem Befehl config überprüfen :docker-compose -f docker-compose.yml -f another-docker-compose.yml config
Gonzalo
Beantwortet das deine Frage? Können Sie optionale Docker-Compose-Dienste definieren?
Eshaan Bansal
@EshaanBansal Ich kenne eine solche Funktion nicht.
VonC

Antworten:

40

Sie können einfach das entrypointodercommand neu definieren , um den Befehl durch etwas zu ersetzen, das nichts bewirkt ( /bin/true)

Das würde den Container sofort verlassen und nichts tun.


Shadi fügt die folgenden Tipps in den Kommentaren hinzu:

Wenn Sie nicht möchten, dass der Service überhaupt erstellt wird, definieren Sie den Build-Schlüssel neu, um auf einen zu verweisen Dockerfile, der nur Folgendes enthält:

FROM tianon/true 
ENTRYPOINT ["/true"]

5andr0 weist in den Kommentaren auf den Abschnittx-disabled: der obersten Ebene hin (eine feldähnliche Erweiterung)

Weitaus bequemer: Verschieben von Diensten für Behinderte in den Bereich der obersten Ebene x-disabled:anstelle vonservices:

Abschnitte mit dem x-Präfix werden analysiert, aber ignoriert, wenn sie nicht in der vorgesehenen Weise als Erweiterungsfeld verwendet werden.

VonC
quelle
14
Ich würde auch hinzufügen / ändern restart: "no", um unendliche Neustarts zu vermeiden
DUzun
2
Dies hilft nicht, wenn Sie diesen Dienst deaktivieren möchten, weil der Dienst nicht einmal gestartet werden kann. In meinem Fall wird I postgres nicht gestartet, da eine andere Instanz von postgres ausgeführt wird und der Befehl ports Konflikte verursacht. Ich könnte anfangen, die Definition zu ändern, aber an diesem Punkt ist es einfacher, das Ganze zu kommentieren.
blueFast
1
Weitaus bequemer: Verschieben von Diensten für Behinderte in den Bereich der obersten Ebene x-disabled:anstelle vonservices:
5andr0
@ 5andr0 Interessant. Gibt es eine Dokumentation für diesen Docker-Compose-Abschnitt?
VonC
docs.docker.com/compose/compose-file/#extension-fields wurde in Version 3.4 eingeführt. Abschnitte mit dem Präfix
x
55

Sie können es in einer docker-compose.override.yamlDatei tun .

Diese Datei wird automatisch von gelesen docker-composeund in die Hauptdatei eingefügt docker-compose.yaml.

Wenn Sie es von Git ausgeschlossen haben, kann jeder Entwickler die Konfiguration (mit einigen Einschränkungen) optimieren, ohne das Original zu ändern docker-compose.yaml.

Daher kann der Dienst fooad-hoc deaktiviert werden, indem sein Einstiegspunkt neu definiert wird in docker-compose.override.yaml:

version: "3"

services:
  foo:
    entrypoint: ["echo", "Service foo disabled"]
Kos Prov
quelle
1
Wenn Sie einen "Neustart: sofern nicht gestoppt" usw. haben, kommentieren Sie dies aus, oder es wird kontinuierlich neu gestartet
Andreas
Die Idee ist, den Einstiegspunkt in der Überschreibungsdatei zu ändern. Wenn Sie Neustartrichtlinien haben, ändern Sie diese in eine Endlosschlafschleife
Kos Prov
Zur Verdeutlichung können Sie dies in docker-compose.yml wie in der Antwort von VonC tun. Dies ist angemessen, wenn Sie es einchecken und mit anderen Entwicklern teilen möchten. Außerdem akzeptiert compose file format v1 Dienstnamen (foo im obigen Beispiel) als Schlüssel der obersten Ebene und nicht als Unterschlüssel von "services".
Denis Howe
1
Diese Lösung funktioniert gut, wenn Sie einen Dienst für eine bestimmte Umgebung (z. B. Entwicklung / Staging / Produktion) deaktivieren / aktivieren möchten, in der Sie für jede Umgebung mit der Option -f eine andere Überschreibungsdatei angegeben haben.
Justin Emery
Mit Docker-Compose v3 können wir env verwenden, um den Dienst zu deaktivieren, dh: export XXX_ENTRYPOINT=/bin/true dann `entrypoint: [" $ {XXX_ENTRYPOINT: -docker-entrypoint.sh} "]`
qxo
9

Ich füge dem Dienst, den ich vorübergehend deaktivieren möchte, die folgende zusätzliche Zeile hinzu:

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

Es fängt trotzdem an, macht aber nichts.

Michele Minno
quelle
5
Eine Neudefinition des commandhat keine Auswirkungen auf den Einstiegspunkt. In Ihrem Beispiel verlassen Sie sich darauf, dass das entrypointist, bashdenke ich. Um dies belastbar zu machen ((unabhängig vom eingebauten entrypoint)), müssen Sie den Einstiegspunkt und nicht den Befehl neu definieren.
blueFast
4

Es gibt keine Möglichkeit, einen in Docker compose yaml file definierten Dienst zu deaktivieren. Der Vorschlag von VonC ist eine gute Problemumgehung. Die verfügbaren Optionen finden Sie unten in der Dokumentation zum Erstellen von Docker. Https://docs.docker.com/compose/compose-file/

Shibashis
quelle
2

Ich würde den Dienst auf 0 Replikate skalieren mit: deploy: replicas: 0

Leider funktioniert dies, wie in der Dokumentation angegeben, nur mit Docker-Schwarm.

Herm
quelle
-3

Ich hab es geschafft:

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

Primitiv, aber fügen Sie #am Anfang jeder Zeile des Dienstes ein hinzu.

Kjeld Flarup
quelle
3
Die Frage betraf Alternativen zum Auskommentieren eines Dienstes.
Michael Härtl