2015-04-13 2 views
25

Wenn Sie zunächst einen Docker Behälter aus einem Bild führen Sie die Option angeben:Wie man einen vorhandenen Docker-Container im Neustart-Modus "immer" neu startet?

--restart="always" 

Dies stellt sicher, dass der Behälter immer vom Docker-Daemon neu gestartet wird, wenn es aus irgendeinem Grund aufhört. So könnte man einen Container wie so laufen:

docker run --restart="always" <IMAGE> 

Sie können auch einen vorhandenen Docker Container neu starten, indem seine Container-ID spezifiziert, das heißt:

docker start <CONTAINER ID> 

aber ich kann nicht feststellen, ob es möglich ist, zu ändern ein vorhandener Container, der ursprünglich nicht mit der Option --restart="always ausgeführt wurde, um ihn in Zukunft immer neu zu starten.

Momentan kann ich nur denken, den Container als neues Bild zu speichern und dann das Bild als neuen Container mit der Option --restart="always" ausführen. Wäre das tatsächlich der richtige Weg?

BEARBEITEN: Was ich vielleicht ursprünglich nicht klar genug gemacht habe, ist, dass ich über die Situation nachdenke, wo es Änderungen im Container gab, seit er ursprünglich ausgeführt wurde, die beibehalten werden müssen. Es würde also nicht ausreichen, einen neuen Container aus dem Originalbild zu erstellen.

Antwort

13

Ok, so meine eigene Frage zu beantworten, scheint es, dass es einfach nicht möglich ist, den gleichen Behälter mit --restart=always, neu zu starten, weil das etwas ist, was Sie tun müssen, wenn Sie Lauf ein Container zum ersten Mal und nicht ein Parameter, den Sie verwenden können, wenn Sie einen vorhandenen Container starten.

Es gibt drei mögliche Abhilfen dazu:

  1. Wie @ user2915097 erwähnt, können Sie die Originalbehälter verlassen (es zu stoppen und dann mit docker rm <CONTAINER ID> Löschen es aufzuräumen). Führen Sie dann einfach einen neuen Container aus dem Originalbild aus und geben Sie diesmal die Option -restart=always an.
  2. Wenn keine Volumes verwendet wurden, also die Änderungen im Container intern sind, müssen Sie den Container für ein neues Image festschreiben und dann einen neuen Container aus diesem Image ausführen.

    docker commit <CONTAINER ID> <NEW IMAGE NAME>

    docker run -d --restart=always ... <NEW IMAGE NAME>

  3. Wenn Mengen verwendet wurden und alle Änderungen werden auf die Mengen beschränkt, dann können Sie einen zweiten Behälter mit dem --volumes-from Parameter ausführen, ohne eine neue Version des Bildes festlegen zu müssen. d.h.

    • docker stop <CONTAINER 1 NAME>
    • docker run -d --restart=always --volumes-from <CONTAINER 1 NAME> ... <ORIGINAL IMAGE NAME>

    Es wäre dann sicher sein Behälter 1 zu löschen, da die Volumina, während ein anderer Behälter werden nicht gelöscht weiterhin, sie zu benutzen.

Ich denke, es gibt eine vierte Möglichkeit auch; Wenn Sie ein Volume und verwendet haben, wissen Sie, dass Änderungen am Container vorgenommen wurden, die sich nicht auf dem Volume befinden. Dann müssen Sie eine Kombination aus (2) und (3) verwenden.

0

Extrakt aus http://www.brandpending.com/blog/2014/11/21/setting-and-re-setting-the-restart-behaviour-of-a-docker-container

Also lassen Sie sagen, dass Sie die Neustart-Richtlinie dieses Behälters von immer auf Ausfall ändern möchten. Um dies zu tun, müssen Sie den Container stoppen, entfernen Sie es und führen Sie es mit der neuen Neustartrichtlinie erneut aus.

+0

Aber das Problem damit ist, dass Sie alle Änderungen im ursprünglichen Container verlieren würden, weil Sie es gelöscht und ein neues von Grund auf neu erstellt haben. Ich bin mir ziemlich sicher, dass das Commit eines neuen Images und das Ausführen eines neuen Containers besser wäre, wenn im ursprünglichen Container Änderungen vorgenommen wurden, die beibehalten werden müssen. –

+0

Also sind wir zurück zu Ihrem Commit – user2915097

+0

@rdc sollten Sie versuchen, Änderungen in Containern wegen solcher Dinge zu vermeiden - entweder in einem Volumen oder einem DB irgendeiner Art. –

3

Update: Dies funktionierte, um den Neustart zu ermöglichen. Aber setze es zurück auf Nein und es wird immer wieder zurückgesetzt und der Container startet wieder! :(Ich werde diese Antwort hier im Fall verlassen jemand herausfindet, wie das wirklich funktioniert. Ich in der Nähe sein muss!

Leute, habe ich die meisten hacky Lösung gefunden, die usw. Kopieren Behälter wird um

vi/var/lib/docker/Container/$ (docker inspizieren -f '{{.ID}}' $ ContainerID) /hostconfig.json

Suche nach "RestartPolicy". Stellen sie ihn auf "nein", "immer" usw.

Vielleicht könnte jemand das wickeln in einem Skript !?

Wie auch immer, dieses Stück von JSON zusammen mit der config.json würde Ihnen erlauben, alle Arten von Dingen zu ändern, die Sie beim Erstellen Ihres Containers vermisst haben.

+0

Ein Wort der Warnung an jeden, der dies versucht, eine Menge von Docker's State Management arbeitet mit der Annahme, dass es das einzige, was den Inhalt von/var/lib/docker ändert . Seien Sie sehr vorsichtig, wenn Sie hier Änderungen vornehmen. –

+1

Ah ja, hängt davon ab, welche Änderungen vorgenommen werden und welche Dateien geöffnet bleiben.Um auf der sicheren Seite zu sein, können Sie Ihren Dockermotor stoppen. Ich hoffe, dass sie die Fähigkeit hinzufügen, Änderungen in nachfolgenden Versionen vorzunehmen. Es ist verrückt, die Neustart-Richtlinie nicht manipulieren zu können. – Matt

+1

Eine neue Set-Funktion kann bald hinzugefügt werden. https://github.com/docker/docker/pull/15078 – Matt

54

Wir haben jetzt Docker update, die Änderung der Neustart-Richtlinie eines laufenden Containers ermöglicht.

docker update --restart=always <CONTAINER ID> 

Es gibt drei weitere Optionen:

  • keine (default)
  • on-Ausfall
  • es sei denn gestoppten

verweisen auf die link für weitere Einzelheiten.

+0

In welcher Version von Docker wurde dies eingeführt? –

+2

Es ist seit Version 1.11.0 verfügbar. –

Verwandte Themen