Wie erstelle ich einen Docker-Container in docker-compose.yml neu?


218

Es gibt Leistungsbereiche, die in docker-compose.yml definiert sind. Diese Dienste wurden gestartet. Ich muss nur eine davon neu erstellen und ohne andere Dienste starten. Ich führe die folgenden Befehle aus:

docker-compose up -d # run all services
docker-compose stop nginx # stop only one. but it still running !!!
docker-compose build --no-cache nginx 
docker-compose up -d --no-deps # link nginx to other services

Am Ende habe ich einen alten Nginx-Container bekommen. Übrigens tötet Docker-Compose nicht alle laufenden Container!


3
docker-compose up --build
— Jinna Balu

Antworten:


232

Docker-komponieren

$docker-compose up -d --no-deps --build <service_name>

--no-deps - Starten Sie keine verknüpften Dienste.

--build - Erstellen Sie Bilder, bevor Sie Container starten.


19
docker-compose build service1 service2 --no-cache macht diesen Job besser ( github.com/docker/compose/issues/1049 ). Ich hatte ein Problem mit zwischengespeicherten Containern, die vor der Verwendung erstellt wurden docker-compose up -d --no-deps --build <service_name>
— evgpisarchik

32
@evgpisarchik Die Bestellungen ein bisschen aus, es sollte seindocker-compose build --no-cache service1 service2
— Matthew Wilcoxson

180

Mit Docker-Compose 1.19 up

docker-compose up --build --force-recreate --no-deps [-d] [<service_name>..]

Ohne ein oder mehrere service_nameArgumente werden alle Container neu erstellt

Aus dem Hilfemenü

Options:
    -d, --detach        Detached mode: Run containers in the background,
                        print new container names. Incompatible with
                        --abort-on-container-exit.
    --no-deps           Don't start linked services.
    --force-recreate    Recreate containers even if their configuration
                        and image haven't changed.
    --build             Build images before starting containers.

4
Ich bin verwirrt, wie dies die Frage beantwortet. Wie bauen wir nur den einen Container wieder auf?
— Duncan Jones

11
Sie können nur einen Container neu erstellen, indem Sie seinen Namen an das Ende des Befehls anhängen. docker-compose up -d --force-recreate --build container_name
— HarlemSquirrel

Warten Sie eine Sekunde, dies erstellt den Container neu , es entspricht nicht der build --no-cacheOption, es sei denn, die Befehlsbeschreibung ist völlig falsch
— Slav

67

Dies sollte Ihr Problem beheben:

docker-compose ps # lists all services (id, name)
docker-compose stop <id/name> #this will stop only the selected container
docker-compose rm <id/name> # this will remove the docker container permanently 
docker-compose up # builds/rebuilds all not already built container 

12
Wenn Sie stopund rmalle Container möchten, können Sie den Befehl verwenden docker-compose down. Ihre Lösung ist besser, wenn Sie nur einige loswerden möchten.
— Hirowatari

Diese Lösung eignet sich gut für das Setup, bei dem Sie nicht die gesamte Docker-Anwendung stoppen und nur einen der Dienste neu erstellen
— möchten

Ich musste docker-compose build <id/name>vorher tatsächlich laufen up, um die geänderte Docker-Datei neu zu erstellen.
— Vajk Hermecz

49

Wie @HarlemSquirrel gepostet hat, ist es das Beste und ich denke die richtige Lösung.

Um das OP-spezifische Problem zu beantworten, sollte es sich jedoch um den folgenden Befehl handeln, da er nicht ALLE Dienste in der docker-compose.ymlDatei neu erstellen möchte , sondern nur den nginxeinen:

docker-compose up -d --force-recreate --no-deps --build nginx

Beschreibung der Optionen:

Options:
  -d                  Detached mode: Run containers in the background,
                      print new container names. Incompatible with
                      --abort-on-container-exit.
  --force-recreate    Recreate containers even if their configuration
                      and image haven't changed.
  --build             Build images before starting containers.
  --no-deps           Don't start linked services.

9

Vielleicht sind diese Schritte nicht ganz richtig, aber ich mag das:

Stop Docker komponieren: $ docker-compose down

Behälter entfernen: $ docker system prune -a

Starten Sie Docker Compose: $ docker-compose up -d


4

Verwenden Sie einfach:

docker-compose build [yml_service_name]

Ersetzen Sie [yml_service_name]durch Ihren Dienstnamen in der docker-compose.ymlDatei. Sie können docker-compose restartdamit sicherstellen, dass Änderungen vorgenommen werden. Sie können --no-cacheden Cache ignorieren.


2

Das Problem ist:

$ docker-compose stop nginx

hat nicht funktioniert (Sie sagten, es läuft noch). Wenn Sie es trotzdem wieder aufbauen wollen, können Sie versuchen, es zu töten:

$ docker-compose kill nginx

Wenn es immer noch nicht funktioniert, versuchen Sie es direkt mit Docker zu stoppen:

$ docker stop nginx

oder löschen Sie es

$ docker rm -f nginx

Wenn dies immer noch nicht funktioniert, überprüfen Sie Ihre Docker-Version. Möglicherweise möchten Sie ein Upgrade durchführen.

Es könnte ein Fehler sein, Sie könnten überprüfen, ob einer mit Ihrem System / Ihrer Version übereinstimmt. Hier ein paar zum Beispiel: https://github.com/docker/docker/issues/10589

https://github.com/docker/docker/issues/12738

Um dieses Problem zu umgehen, können Sie versuchen, den Prozess abzubrechen.

$ ps aux | grep docker 
$ kill 225654 # example process id

1

Für mich wurden nur neue Abhängigkeiten von Docker Hub mit beiden --no-cacheund --pull(die für verfügbar sind) abgerufen docker-compose build.

# other steps before rebuild
docker-compose build --no-cache --pull nginx # rebuild nginx
# other steps after rebuild, e.g. up (see other answers)

0
docker-compose stop nginx # stop if running
docker-compose rm -f nginx # remove without confirmation
docker-compose build nginx # build
docker-compose up -d nginx # create and start in background

Das Entfernen des Behälters mit rm ist unerlässlich. Ohne zu entfernen, startet Docker den alten Container.


-9

Nur:

$ docker-compose restart [yml_service_name]

4
Dadurch werden keine neuen Änderungen erstellt. aus dem Handbuch - Wenn Sie Änderungen an Ihrer Konfiguration von docker-compose.yml vornehmen, werden diese Änderungen nach dem Ausführen dieses Befehls nicht übernommen.
— Denov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.