Docker: el contenedor no se está ejecutando

88

Soy completamente un novato en Docker. Traté de iniciar un contenedor salido como sigue,

  1. Enumeré todos los contenedores disponibles usando docker ps -a. Enumera lo siguiente:

    docker lista todas las imágenes

  2. Ingresé los siguientes comandos para iniciar el contenedor que está en la etapa de salida y entrar en el terminal de esa imagen.

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. Está arrojando el siguiente error.

    FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running

Pero cuando empiezo a usar el contenedor docker start 79b3fa70b51d. Lanza el ID del contenedor como salida, lo cual es normal si todo funciona normalmente. No estoy seguro de qué causa este error. Cualquier idea sobre las causas y sugerencias al respecto me sería de gran ayuda. Gracias por adelantado.

Desconocido
fuente
7
Hola, ¿Podría explicarnos cómo resolvió este problema? Me temo que la respuesta a continuación no tiene mucho sentido
JayPex
4
@ApexFred, los contenedores Docker no son como VM; están diseñados para ejecutar una aplicación. Cuando la aplicación termina, también lo hace el contenedor. En este caso, el usuario ha configurado la "aplicación" para el contenedor en el comando "echo". Debido a que el comando "echo" realiza un eco y luego termina, el contenedor también termina con el comando. Si vuelve a iniciar el contenedor, realiza el eco y vuelve a terminar. El comando EXEC requiere un contenedor en ejecución. Debido a que el contenedor ha terminado, no se puede utilizar para ejecutar comandos adicionales.
duct_tape_coder

Respuestas:

30

El contenedor 79b3fa70b51dparece solo hacer un echo.

Eso significa que comienza, hace eco y luego sale de inmediato.

El siguiente docker execcomando no lo encontraría ejecutándose para adjuntarse a ese contenedor y ejecutar cualquier comando: es demasiado tarde. El contenedor ya salió.

El docker execcomando ejecuta un nuevo comando en un contenedor en ejecución.

El comando que comenzó a usar docker execsolo se ejecutará mientras se esté ejecutando el proceso principal del contenedor (PID 1)

VonC
fuente
1
Hola VonC, gracias por tu comentario. ¿Cómo puedo lograr entrar en el terminal de la imagen?
Stranger
3
@Udhayakumar Un simple docker run -it --rm udhayakumar/busyboxwithtouchdebería ser suficiente para abrir una sesión. El punto de entrada predeterminado debería ser / bin / sh, pero depende de su Dockerfile: es posible que haya definido un punto de entrada diferente y / o una CMD diferente.
VonC
50
Hola, ¿Podría explicarnos cómo resolvió este problema? Me temo que esta respuesta no tiene mucho sentido
JayPex
2
@Jawad Al ejecutar busyboxwithtouch sin ningún parámetro, se utiliza de forma predeterminada el shell interactivo (que no sale inmediatamente). Eso significa que más tarde ( docker exec) puede adjuntarlo.
VonC
61

De forma predeterminada, el contenedor de la ventana acoplable se cerrará inmediatamente si no tiene ninguna tarea ejecutándose en el contenedor.

Para mantener el contenedor ejecutándose en segundo plano, intente ejecutarlo con el argumento --detach(o -d).

Por ejemplo:

docker pull debian

docker run -t -d --name my_debian debian
e7672d54b0c2

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e7672d54b0c2        debian              "bash"              3 minutes ago       Up 3 minutes                            my_debian

#now you can execute command on the container
docker exec -it my_debian bash
root@e7672d54b0c2:/# 
Dio Phung
fuente
22

Si no es posible volver a iniciar el proceso principal (durante el tiempo suficiente), también existe la posibilidad de que commitel contenedor tenga una nueva imagen y ejecute un nuevo contenedor desde esta imagen. Si bien este no es el flujo de trabajo de mejores prácticas habitual , me resulta realmente útil depurar un script que falla de vez en cuando.

docker exec -it 6198ef53d943 bash
Error response from daemon: Container 6198ef53d9431a3f38e8b38d7869940f7fb803afac4a2d599812b8e42419c574 is not running

docker commit 6198ef53d943
sha256:ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

docker run -it ace7ca65e6e bash
root@72d38a8c787d:/#
Matthias Kuhn
fuente
He seguido el mismo paso, pero el contenedor recién creado no es accesible desde el navegador al que se
podía
1
Tenga en cuenta que el comando inicia un bashproceso en el contenedor. Probablemente ya tenía un servidor web en ejecución antes, por lo que tendrá que verificar qué comando debe usarse para volver a activar el servidor.
Matthias Kuhn
10

En primer lugar, tenemos que iniciar el contenedor docker.

ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021

                        3a19b39ea021

Después de eso, verifique el contenedor de la ventana acoplable:

ankit@ankit-HP-Notebook:~$  sudo docker ps -a

 CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                   PORTS               NAMES

  3a19b39ea021        coreapps/ubuntu16.04:latest   "bash"              13 hours ago        
  Up 9 seconds                                 ubuntu1

  455b66057060        hello-world                   "/hello"            4 weeks ago         

Exited (0) 4 weeks ago                       vigorous_bardeen

Luego, ejecute usando el comando a continuación:

ankit@ankit-HP-Notebook:~$  sudo docker exec -it 3a19b39ea021 bash

root@3a19b39ea021:/# 
Ankit gupta
fuente
Sería útil agregar texto que ayude a explicar su respuesta.
Lauren Van Sloun
9

Esto sucede con imágenes para las que el script no lanza un servicio en espera de solicitudes , por lo tanto, el contenedor sale al final del script.

Este suele ser el caso con la mayoría de las imágenes de SO base (centos, debian, etc.), o también con las imágenes de nodo .

Su mejor opción es ejecutar la imagen en modo interactivo . Ejemplo a continuación con la imagen del nodo :

docker run -it node /bin/bash

La salida es

root@cacc7897a20c:/# echo $SHELL
/bin/bash
Michael P. Bazos
fuente
5

Esto es lo que funcionó para mí.

Obtenga el ID del contenedor y reinicie.

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
zee
fuente
3

La razón es justamente lo que decía la respuesta aceptada. Agrego información adicional, que puede proporcionar una mayor comprensión sobre este problema.

  1. El estado de un contenedor incluye Created, Running, Stopped, Exited, Deady otros que yo sepa.
  2. Cuando lo ejecutemos docker create, el demonio docker creará un contenedor con su estado Created.
  3. Cuándo docker start, el demonio de la ventana acoplable iniciará un contenedor existente cuyo estado puede ser Createdo Stopped.
  4. Cuando lo ejecutemos docker run, el demonio docker lo terminará en dos pasos: docker createy docker start.
  5. Cuando docker stop, obviamente, el demonio de la ventana acoplable detendrá un contenedor. Por lo tanto, el contenedor estaría en Stoppedestado.
  6. Viniendo del más importante, un contenedor en realidad se imagina a sí mismo sosteniendo un proceso de largo tiempo en él. Cuando el proceso finaliza, el proceso de retención de contenedores también saldría. Así sería el estado de este contenedor Exited.

¿Cuándo sale el proceso? En otras palabras, ¿cuál es el proceso, cómo lo iniciamos?
La respuesta está CMDen un dockerfile o commanden la siguiente expresión, que está bashpor defecto en algunas imágenes, es decir, ubutu: 18.04.

docker run ubuntu:18.04 [command]
Light.G
fuente
2

Para cualquiera que intente algo similar usando un Dockerfile ...

Ejecutar en modo independiente no ayudará. El contenedor siempre saldrá (dejará de ejecutarse) si el comando no es bloqueante, este es el caso de bash.

En este caso, una solución alternativa sería: 1. Confirmar la imagen resultante: (container_name = el nombre del contenedor en el que desea basar la imagen, image_name = el nombre de la imagen que se creará docker commit container_name image_name 2. Utilice docker run para crear un nuevo contenedor usando la nueva imagen, especificando el comando que desea ejecutar. Aquí, ejecutaré "bash": docker run -it image_name bash

Esto le proporcionaría el inicio de sesión interactivo que está buscando.

ldobson
fuente
2

docker run -it <image_id> /bin/bash

Ejecutar en modo interactivo ejecutando luego bash shell

Syeda Arshiya
fuente
1
Creo que la -dbandera es un error tipográfico aquí.
Ian Buss
1

Aquí hay una solución cuando el contenedor de la ventana acoplable sale normalmente y puede editar el Dockerfile.

Por lo general, cuando se ejecuta un contenedor de la ventana acoplable, una aplicación se sirve ejecutando un comando. De la referencia de Dockerfile ,

Tanto las instrucciones CMD como ENTRYPOINT definen qué comando se ejecuta cuando se ejecuta un contenedor. ... Dockerfile debe especificar al menos uno de los comandos CMD o ENTRYPOINT.

Cuando crea una imagen y no especifica ningún comando con CMD o ENTRYPOINT, se ejecutará el comando CMD o ENTRYPOINT de la imagen base.

Por ejemplo, el Dockerfile oficial de Ubuntu tiene CMD ["/bin/bash"]( https://hub.docker.com/_/ubuntu ). Ahora, el bin/bash/comando puede aceptar entradas y el docker run -it IMAGE_IDcomando adjunta STDIN al contenedor. El resultado es que obtiene una terminal interactiva y el contenedor sigue funcionando.

Cuando se especifica un comando con CMD o ENTRYPOINT en el Dockerfile, este comando se ejecuta cuando se ejecuta el contenedor. Ahora, si este comando puede terminar sin requerir ninguna entrada, terminará y el contenedor saldrá. docker run -it IMAGE_IDse NO ofrecer el terminal interactivo en este caso. Un ejemplo sería la imagen de la ventana acoplable construida a partir del archivo Dockerfile a continuación:

FROM ubuntu
ENTRYPOINT echo hello 

Si necesita ir a la terminal de esta imagen, deberá mantener el contenedor en ejecución modificando el comando entrypoint.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

Después de ejecutar el contenedor normalmente con docker run IMAGE_ID, puede ir a otra terminal y usar docker exec -it CONTAINER_ID bashpara obtener la terminal del contenedor.

Sadman Sakib
fuente
"y puede editar el Dockerfile": punto clave aquí. Voto a favor.
VonC
0

En mi caso, cambié ciertos nombres de archivo y nombres de directorio del directorio principal del Dockerfile. Debido a que contenedor no encuentra los parámetros necesarios para iniciarlo de nuevo.

Después de cambiarle el nombre a los nombres originales, el contenedor comenzó como mantequilla.

Ross
fuente
0

Tengo una opinión diferente sobre esto. Podría hacer un docker psy ver que hay un contenedor docker ejecutándose, incluso traté de reiniciarlo, pero tan pronto como intenté obtener una sesión para él New-PSSession -ContainerId $containerId -RunAsAdministrator, saldría un error, diciendo:

## [error] New-PSSession: La entrada ContainerId xxx no existe, ## [error] o el contenedor correspondiente no se está ejecutando.

Mi problema era que estaba ejecutando con el servicio de red y no tenía suficientes permisos para ver el contenedor, aunque le había otorgado permisos para ejecutar comandos de la ventana acoplable (con la configuración del grupo de seguridad de la ventana acoplable)

No sabía cómo habilitar el trabajo con contenedores, así que tuve que volver a ejecutarlo como usuario administrador.

AbsolutamenteFreeWeb
fuente