Soll ich Docker-Compose verwenden oder ausführen?

129

Gibt es einen Grund zum runStarten einer docker-compose.ymlDatei oder sollten Sie nur verwenden up?

Ich verstehe, dass rundies einen bestimmten Container starten kann, aber ich beziehe mich auf den Fall, in dem Sie ihn verwenden, ohne einen Container anzugeben, damit alle Ihre yml-Container gestartet werden.

Raif
quelle

Antworten:

141

Wie in docker-compose run(2015) erwähnt

Der von run übergebene Befehl überschreibt den in der Dienstkonfiguration definierten Befehl .
Wenn die Webdienstkonfiguration beispielsweise mit gestartet wird bash, wird docker-compose run web python app.pysie mit überschrieben python app.py.

Der zweite Unterschied besteht darin, dass der docker-compose runBefehl keinen der in der Dienstkonfiguration angegebenen Ports erstellt .
Dies verhindert die Portkollisionen mit bereits geöffneten Ports. Wenn Sie möchten, dass die Ports des Dienstes erstellt und dem Host zugeordnet werden, geben Sie das Flag --service-ports an:

$ docker-compose run --service-ports web python manage.py shell

Es sei denn, Sie haben diese spezifischen Anforderungen (Überschreiben eines Befehls oder Ausführen nur eines Containers an verschiedenen Ports) docker-compose up(auch für einen Container).

Können Sie erklären, warum oder wann die Ports nicht erstellt werden sollen? Das ist der Grund, warum oder wann sie möglicherweise mit bereits geöffneten Ports in Konflikt stehen

Einfach, weil docker-compose runeinmalige Befehle für Ihre Dienste ausgeführt werden sollen.
Das heißt, wenn Sie bereits eine ausgeführt haben docker-compose up, werden alle Ihre Container bereits auf den angegebenen Ports von ausgeführt docker-compose.yml.
Doing ein docker-compose runin dieser Phase (um einen einmaligen Befehl ausführen), wenn sie den gleichen Port wurde respektiert, würde sofort scheitern. Daher die standardmäßige Nichterstellung dieser Ports.


Ein weiterer Anwendungsfall (in der Referenz zum Erstellen von Umgebungsvariablen ):

Führen Sie aus, um zu sehen, welche Umgebungsvariablen für einen Dienst verfügbar sind docker-compose run SERVICE env.


Die neueste Version (2019+) dieser Befehle ist aktiviert für docker/docker.github.io:

VonC
quelle
27

Ich möchte darauf hinweisen, dass, wenn Sie Python mit dem PDF-Debugger verwenden:

import pdb; pdb.set_trace()

Es wird nicht in die Shell verschoben, wenn Sie Ihr Skript ausführen mit:

docker-compose up

Wenn Sie jedoch run verwenden, wird es wie erwartet auf den Debugger übertragen:

docker-compose run
Quickinsights
quelle
7

Es gibt eine Antwort von Docker-Dokumenten .

Normalerweise möchten Sie docker-compose up. Verwenden Sie updiese Option, um alle in a definierten Dienste zu starten oder neu zu starten docker-compose.yml. Im Standardmodus "Angehängt" sehen Sie alle Protokolle aller Container. Im "getrennten" Modus ( -d) wird Compose nach dem Starten der Container beendet, die Container werden jedoch weiterhin im Hintergrund ausgeführt.

Der docker-compose runBefehl dient zum Ausführen von "einmaligen" oder "Ad-hoc" -Aufgaben. Es erfordert den Dienstnamen, den Sie ausführen möchten, und startet nur Container für Dienste, von denen der ausgeführte Dienst abhängt. Verwenden Sie run diese Option , um Tests auszuführen oder eine Verwaltungsaufgabe auszuführen, z. B. das Entfernen oder Hinzufügen von Daten zu einem Datenvolumencontainer. Der runBefehl verhält sich so, docker run -tidass er ein interaktives Terminal für den Container öffnet und einen Exit-Status zurückgibt, der dem Exit-Status des Prozesses im Container entspricht.

Jay
quelle
1
Dies sollte die akzeptierte Antwort sein. Verwenden Sie docker-compose rundiese Option grundsätzlich, um Befehle für einen laufenden Dienst auszuführen und docker-compose upeinen neuen Dienst zu erzeugen.
goonerify