Ich habe eine docker-compose.yml
Datei, die 4 Container enthält: Redis, Postgres, API, Worker
Während der Entwicklung von Worker muss ich es häufig neu starten, um Änderungen zu übernehmen. Gibt es eine gute Möglichkeit, einen Container neu zu starten (z. B. worker
), ohne die anderen Container neu zu starten?
docker
docker-compose
Bryan Chen
quelle
quelle
Antworten:
Es ist sehr einfach: Verwenden Sie den Befehl:
Sie können die Wartezeit bis zum Stoppen einstellen, bevor Sie den Container beenden (in Sekunden).
Beachten Sie, dass dadurch der Container neu gestartet wird, ohne ihn jedoch neu zu erstellen. Wenn Sie Ihre Änderungen übernehmen und anschließend neu starten möchten, sehen Sie sich die anderen Antworten an.
quelle
docker-compose restart
Befehle KEINE Änderungen übernehmen. "Wenn Sie Änderungen an Ihrerdocker-compose.yml
Konfiguration vornehmen, werden diese Änderungen nach dem Ausführen dieses Befehls nicht mehr berücksichtigt." Verwenden Sie daherdocker-compose up -d --build
. docs.docker.com/compose/reference/restartdocker ps -a
restart
keine Änderungen angewendet werden , selbst wenn Sie bereits eine ausgeführt habendocker-compose build <container name>
und dies eine nicht funktionierende / falsche Antwort ist.Die anderen Antworten zum Neustart eines einzelnen Knotens sind zielgerichtet
docker-compose restart worker
. Dadurch wird dieser Container zurückgeworfen, es werden jedoch keine Änderungen vorgenommen, selbst wenn Sie ihn separat neu erstellt haben. Sie können manuellstop
,rm
,create
, undstart
, aber es gibt viel einfacher Methoden.Wenn Sie Ihren Code aktualisiert haben, können Sie das Erstellen und Neuladen in einem einzigen Schritt durchführen mit:
Dadurch werden Ihre Bilder zunächst aus geändertem Code neu erstellt. Dies ist schnell, wenn seit der Wiederverwendung des Caches keine Änderungen vorgenommen wurden. Und dann ersetzt es nur die geänderten Container. Wenn Ihre heruntergeladenen Bilder veraltet sind, können Sie dem obigen Befehl Folgendes voranstellen:
Um zuerst geänderte Bilder herunterzuladen (die Container werden erst neu gestartet, wenn Sie einen Befehl wie
up
oben ausführen ). Ein erster Stopp ist nicht erforderlich.Um dies nur für einen einzelnen Dienst zu tun, folgen Sie dem Befehl up oder pull mit den Diensten, die Sie angeben möchten, z.
Hier ist ein kurzes Beispiel für die erste Option: Die Docker-Datei ist so strukturiert, dass die häufig wechselnden Teile des Codes am Ende bleiben. Tatsächlich werden die Anforderungen für die separat abgerufen,
pip install
da sich diese Datei selten ändert. Und da die Nginx- und Redis-Container auf dem neuesten Stand waren, wurden sie nicht neu gestartet. Die Gesamtzeit für den gesamten Prozess betrug weniger als 6 Sekunden:quelle
-no-cache
Option verwendet werden? Angenommen, ich habe etwas zu meinem hinzugefügtpackage.json
und muss es erneut ändern,RUN npm install
aber dasDockerfile
selbst hat sich nicht geändertCOPY
Befehl einfügen , wird der Cache automatisch beschädigt .COPY
Befehl in Ihrer Docker-Datei haben. Dasgit pull
aktualisiert die Datei package.json und der Build-Cache wird unterbrochen, wenn Docker sieht, dass Sie in eine andere Datei kopieren.ADD
stattdessen verwendet,COPY
aber anscheinend ist Letzteres eine bewährte Methode, also werde ich es versuchen!ADD
hat das gleiche Ergebnis wieCOPY
beim Cache-Bust, aber (wie im Link zu den Best Practices vorgeschlagen) benötigen die meisten keine zusätzlichen Funktionen, sodass ich mich nicht einmal darum kümmere, es zu erwähnen.Um einen Dienst mit Änderungen neu zu starten, habe ich folgende Schritte ausgeführt:
quelle
docker-compose up -d --build
ausführen. Dadurch wird alles neu erstellt und alle geänderten Container neu gestartet. Es ist nicht erforderlich, zuerst anzuhalten, da Ausfallzeiten auftreten und separate Befehle zum Erstellen und Starten erforderlich sind.up
nur der Container neu erstellt, der geändert wurde und daher einen Neustart benötigte.Befolgen Sie den Befehl
stoppt und startet einfach den Container. dh ohne Änderungen aus der Datei docker-compose.xml zu laden
STOP ähnelt dem Ruhezustand im PC. Daher sucht stop / start nicht nach Änderungen in der Konfigurationsdatei. Um aus dem Rezept des Containers (docker-compose.xml) neu zu laden, müssen wir den Container entfernen und erstellen (ähnliche Analogie zum Neustart des PCs).
Die Befehle lauten also wie folgt
quelle
rm
Option für die Zeile ist-f
praktisch (keine Eingabeaufforderung) und mit dem aktuellen Dockercreate
undstart
wird zusammengeführt alsup
(also haben wir insgesamt 3 Befehle, nicht 4), und für dieup
Option-d
ist nützlich (die Ausführung erfolgt im Hintergrund).Starten Sie den Dienst mit der Docker-Compose-Datei neu
Anwendungsfall 1: Wenn COMPOSE_FILE_NAME
docker-compose.yml
und Service Worker istAnwendungsfall 2: Wenn der Dateiname lautet
sample.yml
und der Dienst Worker istStandardmäßig sucht Docker-Compose nach dem,
docker-compose.yml
wenn wir dendocker-compose
Befehl ausführen , andernfalls haben wir ein Flag, mit dem wir einen bestimmten Dateinamen angeben können-f [FILE_NAME].yml
quelle
Der einfache Befehl 'docker' weiß nichts über den 'Arbeiter'-Container. Verwenden Sie einen solchen Befehl
docker-compose -f docker-compose.yml restart worker
quelle
Container neu starten
Wenn Sie Ihren Container einfach neu starten möchten:
docker-compose restart servicename
Stellen Sie sich diesen Befehl als "Starten Sie den Container einfach mit seinem Namen neu" vor, was äquivalent zu ist
docker restart
Befehl entspricht.Vorsichtsmaßnahmen beachten:
Wenn Sie ENV-Variablen geändert haben, werden diese im Container nicht aktualisiert. Sie müssen es stoppen und erneut starten. Mit einem einzigen Befehl
docker-compose up
werden Änderungen erkannt und der Container neu erstellt.Wie viele andere bereits erwähnt, werden
docker-compose.yml
diese Änderungen beim einfachen Neustart nicht angewendet , wenn Sie die Datei selbst geändert haben.Wenn Sie Ihren Code in der Erstellungsphase in den Container kopieren (mit
Dockerfile
usingADD
oderCOPY
befehlen), müssen Sie den Container jedes Mal neu erstellen, wenn sich der Code ändert (docker-compose build
).Korrelation zu Ihrem Code
docker-compose restart
sollte einwandfrei funktionieren, wenn Ihr Code durch die Volume-Direktivedocker-compose.yml
wie folgt in den Container abgebildet wird :Ich würde jedoch empfehlen, das Neuladen von Live-Code zu verwenden, das wahrscheinlich von Ihrem Framework im DEBUG-Modus bereitgestellt wird (alternativ können Sie nach Paketen zum automatischen Neuladen in der Sprache Ihrer Wahl suchen). Wenn Sie dies hinzufügen, müssen Sie den Container nicht jedes Mal neu starten, nachdem sich Ihr Code geändert hat, und stattdessen den darin enthaltenen Prozess neu laden.
quelle
Die Antwort hier spricht über die Reflexion der Änderung in der Datei docker-compose.yml.
Aber was ist, wenn ich die Änderungen, die ich vorgenommen habe, in meinen Code integrieren möchte und ich glaube, dass dies nur durch die Neuerstellung des Images möglich ist und dass ich die folgenden Befehle verwende
1. Docker Container Stop
2. Entfernen des Docker-Containers
3. Docker-Image-Entfernung
4. Stellen Sie den Behälter erneut zusammen
quelle