Docker: agregue una política de reinicio a un contenedor que ya se creó

229

Veo que Docker ha agregado algo llamado políticas de reinicio para manejar el reinicio de los contenedores en caso de, por ejemplo, reiniciar.

Si bien esto es muy útil, veo que el comando de política de reinicio solo funciona docker runy no docker start. Entonces mi pregunta es:

¿Hay alguna forma de agregar políticas de reinicio a un contenedor que ya se creó en el pasado?

Tienda Enrique Moreno
fuente
Debería cambiar la respuesta aceptada a la de @Yale Huang. La respuesta aceptada es incorrecta con las versiones actuales de docker. Entiendo que la respuesta podría haberte ayudado en ese entonces, pero ahora es engañoso.
Stepan Vavra
2
Hecho. Gracias por la advertencia.
Tienda de Enrique Moreno

Respuestas:

575

En versiones recientes de docker (a partir de 1.11) tiene un updatecomando:

docker update --restart=always <container>
Pau Ruŀlan Ferragut
fuente
99
Parece que esto se agregó en Docker 1.11.0.
phansen
@phansen: De hecho lo fue .
TachyonVortex
44
Debe ser la respuesta aceptada con la advertencia de que funciona a partir de Docker 1.11.
JohnDoe
66
con docker 17.09 tuve que ejecutar docker update --restart always <container> docs.docker.com/engine/admin/start-containers-automatically
HarlemSquirrel
44
docker updateacepta múltiples ID de contenedores, por lo que no es necesario xargs, simplemente hazlo docker update --restart=always $(docker ps -q).
markusk
49

Hay dos enfoques para modificar RestartPolicy:

  • Encuentre la ID del contenedor, detenga todo el servicio acoplable, modifique /var/lib/docker/containers/CONTAINER_ID/hostconfig.json, establezca RestartPolicy -> Name en "siempre" e inicie el servicio acoplable.
  • docker commit su contenedor como una nueva imagen, detenga y rm el contenedor actual e inicie un nuevo contenedor con la imagen.
Yale Huang
fuente
2
detener contenedor, editar, iniciar contenedor. Funciona de maravilla. No sé por qué la edición está deshabilitada.
niebla
2
Finalmente, una respuesta razonable :)
Navin
Me funcionó en un servidor antiguo con docker 1.10 (no pregunte 😱). Lamentablemente docker updatepermite modificar la política de reinicio solo en 1.11+
Igor Kupczyński
1

El uso de la --restart=alwayspolítica manejará el reinicio de los contenedores existentes en caso de reinicio.

El problema es que si hay varios contenedores con --restart=alwaysal ejecutar la imagen de una versión más reciente como se discutió en ventana acoplable - ¿Cómo desactivar el rearranque automático en un contenedor? .

Intentar eliminar automáticamente el contenedor cuando exista mediante la opción de venta docker run --rmtambién generará problemas con la --restart=always política, ya que están en conflicto entre sí .

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

Entonces, en este caso, es mejor elegir otra opción: - reiniciar la política a menos que se detenga .

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

Esta política no entrará en conflicto con el docker run --rmpero como se explica en la documentación de la ventana acoplable :

Es similar a --restart=always, excepto que cuando el contenedor se detiene (manualmente o de otro modo) , no se reinicia incluso después de reiniciar el demonio Docker.

Entonces, cuando use esta --restart unless-stoppedpolítica, para asegurarse de que el reinicio esté funcionando en caso de que se detenga por accidente cuando cierre el terminal, haga una vez en otro terminal como se muestra a continuación:

$ docker ps
$ docker restart <container>

Espere hasta que el proceso de eliminación finalice en el shell anterior, luego ciérrelo y simplemente salga ( no salga ).
Y verifique nuevamente en el terminal restante si el contenedor aún se está ejecutando:

$ docker ps

Si aún se está ejecutando, puede reiniciar de manera segura y verificar nuevamente que la aplicación se esté reiniciando y ver que su docker esté limpio sin usar múltiples contenedores.

Chetabahana
fuente