Saltar al contenido

¿Cómo iniciar un contenedor Docker detenido con un comando diferente?

Solución:

Encuentra tu ID de contenedor detenido

docker ps -a

Confirmar el contenedor detenido:

Este comando guarda el estado del contenedor modificado en una nueva imagen user/test_image

docker commit $CONTAINER_ID user/test_image

Iniciar / ejecutar con un punto de entrada diferente:

docker run -ti --entrypoint=sh user/test_image

Descripción del argumento del punto de entrada: https://docs.docker.com/engine/reference/run/#/entrypoint-default-command-to-execute-at-runtime

Nota:

Los pasos anteriores simplemente inician un contenedor detenido con el mismo estado del sistema de archivos. Eso es genial para una investigación rápida. Pero las variables de entorno, la configuración de la red, los volúmenes adjuntos y otro personal no se heredan, debe especificar todos estos argumentos explícitamente.

Los pasos para iniciar un contenedor detenido se han tomado prestados de aquí: (último comentario) https://github.com/docker/docker/issues/18078

Edite este archivo (correspondiente a su contenedor detenido):

vi /var/lib/docker/containers/923...4f6/config.json

Cambie el parámetro “Ruta” para que apunte a su nuevo comando, por ejemplo, / bin / bash. También puede configurar el parámetro “Args” para pasar argumentos al comando.

Reinicie el servicio de Docker (tenga en cuenta que esto detendrá todos los contenedores en ejecución):

service docker restart

Enumere sus contenedores y asegúrese de que el comando haya cambiado:

docker ps -a

Inicie el contenedor y conéctelo, ¡ahora debería estar en su caparazón!

docker start -ai mad_brattain

Trabajó en Fedora 22 usando Docker 1.7.1.

NOTA: Si su shell no es interactivo (por ejemplo, no creó el contenedor original con la opción -it), puede cambiar el comando a “/ bin / sleep 600” o “/ bin / tail -f / dev / null” para dar tiene tiempo suficiente para hacer “docker exec -it CONTID / bin / bash” como otra forma de obtener un shell.

NOTA 2: Las versiones más nuevas de Docker tienen config.v2.json, donde deberá cambiar Entrypoint o Cmd (gracias user60561).

Agregue una marca en la parte superior de su secuencia de comandos de Entrypoint

Docker realmente necesita implementar esto como una nueva característica, pero aquí hay otra opción de solución para situaciones en las que tiene un punto de entrada que termina después de un éxito o un fracaso, lo que puede dificultar la depuración.

Si aún no tiene un script de Entrypoint, cree uno que ejecute los comandos que necesite para su contenedor. Luego, en la parte superior de este archivo, agregue estas líneas a entrypoint.sh:

# Run once, hold otherwise
if [ -f "already_ran" ]; then
    echo "Already ran the Entrypoint once. Holding indefinitely for debugging."
    cat
fi
touch already_ran

# Do your main things down here

Para asegurar eso cat mantiene la conexión, es posible que deba proporcionar un TTY. Estoy ejecutando el contenedor con mi script Entrypoint así:

docker run -t --entrypoint entrypoint.sh image_name

Esto hará que el script se ejecute una vez, creando un archivo que indica que ya se ha ejecutado (en el sistema de archivos virtual del contenedor). Luego puede reiniciar el contenedor para realizar la depuración:

docker start container_name

Cuando reinicia el contenedor, el already_ran se encontrará el archivo, lo que provocará que el script Entrypoint se detenga con cat (que solo espera para siempre una entrada que nunca llegará, pero mantiene vivo el contenedor). Luego puede ejecutar una depuración bash sesión:

docker exec -i container_name bash

Mientras el contenedor se está ejecutando, también puede eliminar already_ran y ejecutar manualmente el entrypoint.sh script para volver a ejecutarlo, si necesita depurarlo de esa manera.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *