Docker: Dodaj zasadę restartu do kontenera, który został już utworzony

229

Widzę, że Docker dodał coś, co nazywa się zasadami restartowania, aby obsłużyć restart kontenerów w przypadku, na przykład, restartu.

Chociaż jest to bardzo przydatne, widzę, że polecenie zasad restartu po prostu działa docker runi nie działa docker start. Więc moje pytanie brzmi:

Czy jest jakiś sposób na dodanie zasad restartu do kontenera, który został już utworzony w przeszłości?

Namiot Enrique Moreno
źródło
Powinieneś zmienić zaakceptowaną odpowiedź na @Yale Huang. Akceptowana odpowiedź jest niepoprawna w przypadku bieżących wersji dokera. Rozumiem, że odpowiedź mogła ci wtedy pomóc, ale teraz jest myląca.
Stepan Vavra
2
Gotowe. Dziękuję za ostrzeżenie.
Namiot Enrique Moreno

Odpowiedzi:

574

W najnowszych wersjach okna dokowanego (od 1.11) masz updatepolecenie:

docker update --restart=always <container>
Pau Ruŀlan Ferragut
źródło
9
Wygląda na to, że zostało to dodane w Docker 1.11.0.
phansen
@phansen: Rzeczywiście tak było .
TachyonVortex
4
Powinna być zaakceptowana odpowiedź z zastrzeżeniem, że działa ona od wersji Docker 1.11.
JohnDoe,
6
z dokerem 17.09 musiałem uruchomić docker update --restart always <container> docs.docker.com/engine/admin/start-containers-automatically
HarlemSquirrel
4
docker updateakceptuje wiele identyfikatorów kontenerów, więc nie ma takiej potrzeby xargs, po prostu zrób docker update --restart=always $(docker ps -q).
markusk
49

Istnieją dwa podejścia do modyfikacji RestartPolicy:

  • Znajdź identyfikator kontenera, zatrzymaj całą usługę dokowania, zmodyfikuj /var/lib/docker/containers/CONTAINER_ID/hostconfig.json, ustaw RestartPolicy -> Nazwa na „zawsze” i uruchom usługę dokowania.
  • docker commit swój kontener jako nowy obraz, zatrzymaj bieżący kontener i uruchom nowy kontener z obrazem.
Yale Huang
źródło
2
zatrzymaj kontener, edytuj, uruchom kontener. działa jak marzenie. Nie wiem, dlaczego edycja jest wyłączona.
mgła
2
Wreszcie rozsądna odpowiedź :)
Navin
Pracowałem dla mnie na starym serwerze z dokerem 1.10 (nie pytaj 😱). Niestety docker updatezezwala na modyfikację zasad restartu tylko 1.11+
Igor Kupczyński
1

Użycie --restart=alwayszasad zajmie się ponownym uruchomieniem istniejących kontenerów w przypadku ponownego uruchomienia.

Problem polega na tym, że jeśli istnieje wiele kontenerów z --restart=alwaysuruchomionym obrazem nowszej wersji, jak omówiono w oknie dokowanym - jak wyłączyć automatyczne ponowne uruchamianie kontenera? .

Próba automatycznego usunięcia kontenera, gdy istnieje on przez opcję sprzedaży, docker run --rmbędzie również stanowić problem dla --restart=always zasad, ponieważ są one ze sobą w konflikcie .

$ docker run --rm --restart always <image>
Conflicting options: --restart and --rm

Dlatego w takim przypadku lepiej wybrać inną opcję: - zrestartuj, chyba że zatrzymano zasadę .

$ docker run --rm --restart unless-stopped <image>

Polityka ta nie będzie sprzecznedocker run --rm ale jak wyjaśniono w dokumentacji Döcker :

Podobnie jest --restart=alwaysz tym wyjątkiem, że gdy kontener zostanie zatrzymany (ręcznie lub w inny sposób) , nie zostanie ponownie uruchomiony nawet po ponownym uruchomieniu demona Docker.

Dlatego podczas korzystania z tej --restart unless-stoppedzasady, aby upewnić się, że ponowne uruchomienie działa, na wypadek gdyby zatrzymało się przypadkowo po zamknięciu terminala, wykonaj raz w innym terminalu, jak poniżej:

$ docker ps
$ docker restart <container>

Poczekaj, aż proces zabijania zakończy się w poprzedniej powłoce, a następnie zamknij ją i po prostu wyjdź ( nie wyjdź ).
I sprawdź ponownie w pozostałym terminalu, czy kontener nadal działa:

$ docker ps

Jeśli nadal działa, możesz bezpiecznie zrestartować komputer i ponownie sprawdzić, czy aplikacja uruchamia się ponownie, i zobaczyć, czy okno dokowane jest czyste bez nieużywanego wielu kontenerów.

Chetabahana
źródło