¿Cómo reiniciar un contenedor Docker existente en el modo restart = "siempre"?


Cuando inicialmente ejecuta un contenedor Docker desde una imagen, puede especificar la opción:

--restart="always"

Esto asegura que el contenedor siempre sea reiniciado por el demonio Docker si por alguna razón se detiene. Así que podrías ejecutar un contenedor así:

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

También puede reiniciar un contenedor Docker existente especificando su ID de contenedor, es decir:

docker start <CONTAINER ID>

Sin embargo, no puedo determinar si es posible cambiar un contenedor existente, que originalmente no se ejecutó con el --restart="always opción, para convertirlo a reiniciar siempre en el futuro.

Actualmente, la única forma en que puedo pensar para hacer esto es guardar el contenedor como una nueva imagen y luego ejecutar esa imagen como un nuevo contenedor con la opción --restart="always". ¿Sería ésta, de hecho, la manera correcta de hacerlo?

EDIT : Lo que quizás no dejé suficientemente claro originalmente es que estoy pensando en la situación en la que ha habido cambios en el contenedor desde que se ejecutó originalmente, que deben persistir. Así que sólo ejecutar un nuevo contenedor desde la imagen original no sería suficiente.

 29
Author: smac89, 2015-04-13

4 answers

Ahora tenemos docker update, que permite cambiar la política de reinicio de un contenedor en ejecución.

docker update --restart=always <CONTAINER ID>

Hay otras tres opciones:

  • no (por defecto)
  • en caso de fallo
  • unless-stopped

Consulte el enlace para obtener más información.

 67
Author: Frank Wong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-03 20:52:51

Ok, así que para responder a mi propia pregunta, parece que no es posible reiniciar el mismo contenedor con --restart=always, porque eso es algo que tiene que hacer cuando ejecutaun contenedor por primera vez y no un parámetro que puede usar cuando inicia un contenedor existente.

Hay tres posibles soluciones a esto:

  1. Como indicó @user2915097, puede abandonar el contenedor original (detenerlo y luego eliminarlo con docker rm <CONTAINER ID> para ordenar hasta). A continuación, simplemente ejecute un nuevo contenedor desde la imagen original especificando la opción -restart=always esta vez.
  2. Si no se utilizaron volúmenes, por lo que los cambios son internos del contenedor, debe confirmar el contenedor a una nueva imagen y luego ejecutar un nuevo contenedor desde esa imagen.

    docker commit <CONTAINER ID> <NEW IMAGE NAME>

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

  3. Si se usaron volúmenes y todos los cambios están restringidos a los volúmenes, entonces puede ejecutar un segundo contenedor con el parámetro --volumes-from sin tener que nueva versión de la imagen. es decir,

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

    Entonces sería seguro eliminar el Contenedor 1, ya que los volúmenes no se eliminarán mientras otro contenedor continúe usándolos.

Supongo que también hay una cuarta posibilidad; si usaste un volumen(s) y sabes que ha habido cambios en el contenedor que no están en el volumen, entonces tendrás que usar una combinación de (2) y (3).

 13
Author: Richard Corfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-16 15:20:50

Actualizar: Esto funcionó para habilitar el reinicio. Pero al volver a no y se restablece de nuevo a siempre y el contenedor comienza de nuevo! : (Voy a dejar esta respuesta aquí en caso de que alguien se dé cuenta de cómo funciona esto realmente. Debo estar cerca!

Amigos, he encontrado la solución más pirateada que evita copiar contenedores, etc.

Vi /var/lib/docker/containers/containers(docker inspect-f '{{ .Id}} ' Contain containerId)/hostconfig.json

Buscar "RestartPolicy". Ponlo en" no"," siempre", etc

Tal vez alguien podría envolver eso en un guión!?

De todos modos, esa pieza de json junto con la configuración.json te permitiría modificar todo tipo de cosas que te perdiste al crear tu contenedor.

 3
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-16 22:59:18

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

Digamos que desea cambiar la política de reinicio de este contenedor de siempre a on-failure. Para hacer esto, debe detener el contenedor, elimínelo y vuelva a ejecutarlo con la nueva directiva de reinicio.

 0
Author: user2915097,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-06 10:00:06