hub - docker tutorial
¿Cómo reiniciar un contenedor Docker existente en el modo restart="always"? (4)
Ahora tenemos la update Docker, que permite cambiar la política de reinicio de un contenedor en ejecución.
docker update --restart=always <CONTAINER ID>
Hay otras tres opciones:
- ningún valor predeterminado)
- on-failure
- a menos que-parado
Por favor, consulte el link para más detalles.
Cuando inicialmente ejecuta un contenedor Docker desde una imagen, puede especificar la opción:
--restart="always"
Esto garantiza que el contenedor siempre se reinicia por el daemon Docker si por alguna razón se detiene. Para que puedas 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 la --restart="always
, para convertirlo y reiniciarlo 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 --restart="always"
. ¿Esta sería de hecho la forma correcta de hacer esto?
EDITAR : Lo que quizás no dejé suficientemente claro originalmente es que estoy pensando en la situación en la que se han producido cambios en el contenedor desde que se ejecutó originalmente, que necesitan persistir. Entonces, simplemente ejecutar un nuevo contenedor desde la imagen original no sería suficiente.
Ok, entonces, para responder a mi propia pregunta, parece que no es posible reiniciar el mismo contenedor con --restart=always
, porque eso es algo que tienes que hacer cuando ejecutas un contenedor por primera vez y no un parámetro que tú puede usar cuando inicias un contenedor existente.
Hay tres posibles soluciones a esto:
- Como declaró @ user2915097, puede abandonar el contenedor original (deteniéndolo y luego eliminándolo con
docker rm <CONTAINER ID>
para ponerlo en orden). Luego solo ejecute un nuevo contenedor desde la imagen original especificando la opción-restart=always
esta vez. Si no se usaron volúmenes, por lo que los cambios son internos al contenedor, debe asignar 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>
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 comprometer una 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 hay una cuarta posibilidad también; si usó un volumen (s) y sabe que ha habido cambios en el contenedor que no están en el volumen, entonces deberá usar una combinación de (2) y (3).
Así que supongamos que quiere cambiar la política de reinicio de este contenedor de siempre a on-failure. Para hacer esto, debe detener el contenedor, eliminarlo y volver a ejecutarlo con la nueva política de reinicio.
Actualización: Esto funcionó para permitir el reinicio. ¡Pero volviéndolo a cero y vuelve a restablecerse a siempre y el contenedor comienza de nuevo! :( Voy a dejar esta respuesta aquí en caso de que alguien descubra cómo funciona esto realmente. ¡Debo estar cerca!
Amigos, he encontrado la solución más hacky que se mueve copiando contenedores, etc.
vi / var / lib / docker / containers / $ (docker inspect -f ''{{.Id}}'' $ ContainerID) /hostconfig.json
Busque "RestartPolicy". Establézcalo en "no", "siempre", etc.
¡¿Tal vez alguien podría envolver eso en un guión ?!
De todos modos, esa pieza de json junto con config.json te permitiría modificar todo tipo de cosas que te perdiste al crear tu contenedor.