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!

Yuklia
quelle
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.

denov
quelle
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.
HarlemSquirrel
quelle
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 
ArgonQQ
quelle
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.
Slavik Meltser
quelle
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

Sergey Ivchenko
quelle
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.

FarhadMohseni
quelle
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
user2707671
quelle
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)
kmindi
quelle
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.

Nex
quelle
-9

Nur:

$ docker-compose restart [yml_service_name]
ALEXANDER GOMEZ HIGUITA
quelle
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