wake-up-neo.com

So starten Sie einen einzelnen Container mit docker-compose neu

Ich habe eine docker-compose.yml -Datei, die 4 Container enthält: redis, postgres, api, worker

Während der Entwicklung des Workers muss ich ihn oft neu starten, um die Änderungen zu übernehmen. Gibt es eine gute Möglichkeit, einen Container neu zu starten (z. B. worker), ohne die anderen Container neu zu starten?

253
Bryan Chen

Es ist sehr einfach: Verwenden Sie den Befehl:

docker-compose restart worker

Sie können die Wartezeit bis zum Stoppen des Containers einstellen (in Sekunden).

docker-compose restart -t 30 worker

Beachten Sie, dass der Container dadurch neu gestartet wird, ohne ihn neu zu erstellen. Wenn Sie Ihre Änderungen übernehmen und anschließend neu starten möchten, sehen Sie sich die anderen Antworten an.

314
bmkrio

Die anderen Antworten auf den Neustart eines einzelnen Knotens befinden sich im Ziel docker-compose restart worker. Dadurch wird der Container zurückgesetzt, es werden jedoch keine Änderungen berücksichtigt, auch wenn Sie ihn separat neu erstellen. Sie können manuell stop, rm, create und start, aber es gibt viel einfachere Methoden.

Wenn Sie Ihren Code aktualisiert haben, können Sie den Build und das Neuladen in einem einzigen Schritt durchführen:

docker-compose up --detach --build

Dadurch werden Ihre Bilder zunächst aus geändertem Code wiederhergestellt. Dies ist schnell, wenn sich seit der Wiederverwendung des Caches keine Änderungen ergeben. Und dann ersetzt es nur die geänderten Container. Wenn Ihre heruntergeladenen Bilder veraltet sind, können Sie dem obigen Befehl Folgendes voranstellen:

docker-compose pull

So laden Sie zuerst geänderte Bilder herunter (die Container werden erst dann neu gestartet, wenn Sie einen Befehl wie den obigen Befehl up ausführen). Ein erster Stopp ist nicht erforderlich.

Und 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.

docker-compose up --detach --build worker

Hier ist ein kurzes Beispiel für die erste Option: Die Docker-Datei ist so aufgebaut, dass die sich häufig ändernden Teile des Codes gegen Ende beibehalten werden. Tatsächlich werden die Anforderungen für den pip install separat abgerufen, 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:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-Alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s
136
BMitch

Um einen Dienst mit Änderungen neu zu starten, habe ich folgende Schritte ausgeführt:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker
18
Jeff

Folgender Befehl

docker-compose restart worker

stoppt und startet den Container. das heißt, ohne Änderungen aus der 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 (Analog zum Neustart des PCs)

Die Befehle lauten also wie folgt

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation
8
Mr Coder

Der einfache Befehl 'docker' kennt den Container 'worker' nicht. Verwenden Sie den folgenden Befehl

docker-compose -f docker-compose.yml restart worker

5
Shtlzut

Starten Sie den Dienst mit der Docker-Compose-Datei neu

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

se Case # 1: Wenn COMPOSE_FILE_NAME docker-compose.yml ist und der Dienst ein Arbeiter ist

docker-compose restart worker

se Case # 2: Wenn der Dateiname sample.yml ist und der Dienst Arbeiter ist

docker-compose -f sample.yml restart worker

Standardmäßig sucht docker-compose nach dem docker-compose.yml, wenn wir den docker-compose -Befehl ausführen, andernfalls haben wir das Flag, um einen bestimmten Dateinamen mit -f [FILE_NAME].yml zu vergeben.

5
Jinna Balu

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 anhand seines Namens neu" vor, was dem Befehl docker restart entspricht.

Beachten Sie die Vorsichtsmaßnahmen:

  1. Wenn Sie ENV-Variablen geändert haben, werden diese nicht im Container aktualisiert. Sie müssen es stoppen und neu starten. Oder mit dem Befehl docker-compose up werden Änderungen erkannt und der Container neu erstellt.

  2. Wie viele andere erwähnt haben, werden diese Änderungen durch einen einfachen Neustart nicht übernommen, wenn Sie die docker-compose.yml -Datei selbst geändert haben.

  3. Wenn Sie Ihren Code in der Erstellungsphase innerhalb des Containers kopieren (in Dockerfile mit ADD oder COPY Befehlen), müssen Sie den Container jedes Mal neu erstellen (docker-compose build ).

Korrelation zu Ihrem Code

docker-compose restart sollte einwandfrei funktionieren, wenn Ihr Code in docker-compose.yml per Volume-Direktive in den Container gemappt wird:

services:

  servicename:
    volumes:
      - .:/code

Ich würde jedoch empfehlen, das Neuladen von Live-Code zu verwenden, das wahrscheinlich von Ihrem gewählten 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, muss der Container nicht jedes Mal neu gestartet werden, nachdem sich der Code geändert hat. Stattdessen muss der Prozess neu geladen werden.

0
Lev Rubel