Docker: ajouter une stratégie de redémarrage à un conteneur déjà créé

229

Je vois que Docker a ajouté quelque chose appelé politiques de redémarrage pour gérer le redémarrage des conteneurs en cas de redémarrage, par exemple.

Bien que cela soit très utile, je constate que la commande de stratégie de redémarrage fonctionne avec docker runet non docker start. Ma question est donc:

Existe-t-il un moyen d'ajouter des stratégies de redémarrage à un conteneur déjà créé par le passé?

Tente Enrique Moreno
la source
Vous devez remplacer la réponse acceptée par celle de @Yale Huang. La réponse acceptée est incorrecte avec les versions actuelles de docker. Je comprends que la réponse vous a peut-être aidé à l'époque, mais maintenant elle est trompeuse.
Stepan Vavra
2
Terminé. Merci pour l'avertissement.
Tente Enrique Moreno

Réponses:

575

Dans les versions récentes de docker (à partir de 1.11), vous avez une updatecommande:

docker update --restart=always <container>
Pau Ruŀlan Ferragut
la source
9
Il semble que cela ait été ajouté dans Docker 1.11.0.
phansen
@phansen: Effectivement .
TachyonVortex
4
Doit être la réponse acceptée avec la mise en garde que cela fonctionne à partir de Docker 1.11.
JohnDoe
6
avec docker 17.09 j'ai dû exécuter docker update --restart always <container> docs.docker.com/engine/admin/start-containers-automatically
HarlemSquirrel
4
docker updateaccepte plusieurs ID de conteneur, donc pas besoin du xargstout, faites-le docker update --restart=always $(docker ps -q).
markusk
49

Il existe deux approches pour modifier RestartPolicy:

  • Recherchez l'ID du conteneur, arrêtez l'ensemble du service Docker, modifiez /var/lib/docker/containers/CONTAINER_ID/hostconfig.json, définissez RestartPolicy -> Name sur "Always" et démarrez le service Docker.
  • docker commit votre conteneur en tant que nouvelle image, arrêtez & rm le conteneur actuel et démarrez un nouveau conteneur avec l'image.
Yale Huang
la source
2
arrêter le conteneur, modifier, démarrer le conteneur. fonctionne comme un charme. Je ne sais pas pourquoi l'édition est désactivée.
brouillard
2
Enfin, une réponse raisonnable :)
Navin
A travaillé pour moi sur un ancien serveur avec docker 1.10 (ne demandez pas 😱). docker updatePermet malheureusement de modifier la politique de redémarrage uniquement sur 1.11+
Igor Kupczyński
1

L'utilisation de la --restart=alwaysstratégie gérera le redémarrage des conteneurs existants en cas de redémarrage.

Le problème est que s'il existe plusieurs conteneurs avec --restart=alwayslorsque vous exécutez l'image d'une version plus récente, comme indiqué dans Docker - comment désactiver le redémarrage automatique sur un conteneur? .

Essayer de supprimer automatiquement le conteneur lorsqu'il existe par l'option put docker run --rmposera également un problème avec la --restart=always stratégie car ils sont en conflit les uns avec les autres .

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

Dans ce cas, il est préférable de choisir une autre option: - redémarrer la stratégie sauf arrêt .

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

Cette politique ne sera pas en conflit l' docker run --rmmais comme expliqué dans la documentation docker :

Il est similaire à --restart=always, sauf que lorsque le conteneur est arrêté (manuellement ou autrement) , il n'est pas redémarré même après le redémarrage du démon Docker.

Donc, lorsque vous utilisez cette --restart unless-stoppedstratégie, pour vous assurer que le redémarrage fonctionne au cas où il s'arrêterait par accident lorsque vous fermez le terminal, effectuez une fois dans un autre terminal comme ci-dessous:

$ docker ps
$ docker restart <container>

Attendez la fin du processus de mise à mort dans le shell précédent, puis fermez-le et partez ( ne quittez pas ).
Et vérifiez à nouveau dans le terminal restant si le conteneur est toujours en cours d'exécution:

$ docker ps

S'il est toujours en cours d'exécution, vous pouvez redémarrer en toute sécurité et vérifier à nouveau que l'application redémarre et voir que votre docker est propre sans utiliser plusieurs conteneurs.

Chetabahana
la source