Docker: il contenitore non è in esecuzione


92

Sono completamente un principiante di Docker. Ho provato ad avviare un container uscito come segue,

  1. Ho elencato tutti i contenitori disponibili utilizzando docker ps -a. Elencava quanto segue:

    docker elenca tutte le immagini

  2. Ho inserito i seguenti comandi per avviare il contenitore che si trova nella fase di uscita ed entrare nel terminale di quell'immagine.

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. Sta generando il seguente errore.

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

Ma quando avvio il contenitore usando docker start 79b3fa70b51d. Genera l'ID del contenitore come output, il che è normale se tutto funziona normalmente. Non sono sicuro di cosa causa questo errore. Qualsiasi idea sulle cause e sui suggerimenti in merito sarebbe di grande aiuto per me. Grazie in anticipo.


7
Ciao, puoi spiegarci come hai risolto questo problema. Temo che la risposta di seguito non abbia molto senso
JayPex

4
@ApexFred, i contenitori Docker non sono come le VM; sono progettati per eseguire un'applicazione. Quando l'applicazione termina, così fa il contenitore. In questo caso, l'utente ha impostato l '"applicazione" per il contenitore sul comando "echo". Poiché il comando "echo" esegue un'eco e quindi termina, anche il contenitore termina con il comando. Se avvia di nuovo il contenitore, esegue l'eco e termina di nuovo. Il comando EXEC richiede un contenitore in esecuzione. Poiché il contenitore è terminato, non può essere utilizzato per eseguire comandi aggiuntivi.
duct_tape_coder

Risposte:


31

Il contenitore 79b3fa70b51dsembra fare solo un file echo.

Ciò significa che si avvia, si eco e quindi si chiude immediatamente.

Il docker execcomando successivo non lo troverebbe in esecuzione per attaccarsi a quel contenitore ed eseguire qualsiasi comando: è troppo tardi. Il contenitore è già uscito.

Il docker execcomando esegue un nuovo comando in un contenitore in esecuzione.

Il comando avviato utilizzando docker execverrà eseguito solo durante l'esecuzione del processo principale del contenitore (PID 1)


1
Hey VonC, grazie per il tuo commento. Come posso arrivare ad entrare nel terminale dell'immagine?
Stranger

3
@Udhayakumar Un semplice docker run -it --rm udhayakumar/busyboxwithtouchdovrebbe essere sufficiente per aprire una sessione. Il punto di ingresso predefinito dovrebbe essere / bin / sh, ma dipende dal Dockerfile: potresti aver definito un punto di ingresso diverso e / o un CMD diverso.
VonC

51
Ciao, puoi spiegarci come hai risolto questo problema. Temo che questa risposta non abbia molto senso
JayPex

2
@Jawad Eseguendo busyboxwithtouch senza alcun parametro, viene impostata la shell interattiva (che non esce immediatamente). Ciò significa che puoi docker execcollegarlo in seguito ( ).
VonC

62

Per impostazione predefinita, il contenitore docker verrà chiuso immediatamente se non sono presenti attività in esecuzione sul contenitore.

Per mantenere il contenitore in esecuzione in background, prova a eseguirlo con l' argomento --detach(o -d).

Per esempio:

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:/# 

Questa dovrebbe essere la risposta, fantastico.
MY

22

Se non è possibile riavviare il processo principale (abbastanza a lungo), c'è anche la possibilità per commitil contenitore di una nuova immagine ed eseguire un nuovo contenitore da questa immagine. Anche se questo non è il solito flusso di lavoro di best practice , trovo davvero utile eseguire il debug di uno script in errore una volta ogni tanto.

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:/#

Ho seguito lo stesso passaggio ma il contenitore appena creato non è accessibile dal browser che era accessibile prima
Muhammad Muazzam

1
Tieni presente che il comando avvia un bashprocesso nel contenitore. Probabilmente avevi un server web in esecuzione prima, quindi dovrai controllare quale comando deve essere utilizzato per ripristinare il server.
Matthias Kuhn

10

Prima di tutto, dobbiamo avviare il container docker

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

                        3a19b39ea021

Successivamente, controlla il contenitore docker:

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

Quindi esegui utilizzando il comando seguente:

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

root@3a19b39ea021:/# 

Sarebbe utile aggiungere del testo che aiuti a spiegare la tua risposta.
Lauren Van Sloun

9

Questo accade con le immagini per le quali lo script non avvia un servizio in attesa di richieste , quindi il contenitore esce alla fine dello script.

Questo è in genere il caso della maggior parte delle immagini del sistema operativo di base (centos, debian, ecc.), O anche delle immagini dei nodi .

La soluzione migliore è eseguire l'immagine in modalità interattiva . Esempio sotto con l' immagine del nodo :

docker run -it node /bin/bash

L'output è

root@cacc7897a20c:/# echo $SHELL
/bin/bash

5

Ecco cosa ha funzionato per me.

Ottieni l'ID del contenitore e riavvia.

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


3

Il motivo è proprio quello che diceva la risposta accettata. Aggiungo alcune informazioni extra, che possono fornire un'ulteriore comprensione di questo problema.

  1. Lo stato di un contenitore include Created, Running, Stopped, Exited, Deade altri come lo so.
  2. Quando eseguiamo docker create, il demone docker creerà un contenitore con il suo stato Created.
  3. Quando docker start, docker daemon avvierà un contenitore esistente il cui stato può essere Createdo Stopped.
  4. Quando eseguiamo docker run, il demone docker lo finirà in due passaggi: docker createe docker start.
  5. Quando docker stop, ovviamente, il demone docker fermerà un container. Quindi il contenitore sarebbe nello Stoppedstato.
  6. Venendo al più importante, un contenitore in realtà immagina di contenere un lungo processo al suo interno. Quando il processo termina, verrà chiuso anche il processo di contenimento del contenitore. Quindi lo stato di questo contenitore sarebbe Exited.

Quando termina il processo? In altre parole, qual è il processo, come l'abbiamo avviato?
La risposta è CMDin un dockerfile o commandnella seguente espressione, che è bashdi default in alcune immagini, cioè ubutu: 18.04.

docker run ubuntu:18.04 [command]

3

docker run -it <image_id> /bin/bash

Esegui in modalità interattiva eseguendo quindi bash shell


1
Penso che la -dbandiera sia un errore di battitura qui?

2

Per chiunque tenti qualcosa di simile usando un Dockerfile ...

L'esecuzione in modalità distaccata non aiuta. Il contenitore uscirà sempre (smetterà di funzionare) se il comando non è bloccante, questo è il caso di bash.

In questo caso, una soluzione potrebbe essere: 1. Eseguire il commit dell'immagine risultante: (container_name = il nome del contenitore su cui si desidera basare l'immagine, image_name = il nome dell'immagine da creare docker commit nome_contenitore nome_immagine 2. Usa docker run per creare un nuovo container usando la nuova immagine, specificando il comando che vuoi eseguire. Qui eseguirò "bash": docker run -it nome_immagine bash

In questo modo otterrai l'accesso interattivo che stai cercando.


1

Ecco una soluzione quando il contenitore Docker esce normalmente e puoi modificare il Dockerfile.

In genere, quando viene eseguito un contenitore Docker, un'applicazione viene servita eseguendo un comando. Dal riferimento Dockerfile ,

Entrambe le istruzioni CMD e ENTRYPOINT definiscono quale comando viene eseguito durante l'esecuzione di un contenitore. ... Dockerfile deve specificare almeno uno dei comandi CMD o ENTRYPOINT.

Quando si crea un'immagine e non si specifica alcun comando con CMD o ENTRYPOINT, verrà eseguito il comando CMD o ENTRYPOINT dell'immagine di base.

Ad esempio, il Dockerfile ufficiale di Ubuntu ha CMD ["/bin/bash"]( https://hub.docker.com/_/ubuntu ). Ora, il bin/bash/comando può accettare input e il docker run -it IMAGE_IDcomando allega STDIN al contenitore. Il risultato è che ottieni un terminale interattivo e il contenitore continua a funzionare.

Quando un comando con CMD o ENTRYPOINT viene specificato nel Dockerfile, questo comando viene eseguito durante l'esecuzione del contenitore. Ora, se questo comando può finire senza richiedere alcun input, finirà e il contenitore uscirà. docker run -it IMAGE_IDsarà NON fornire terminale interattivo in questo caso. Un esempio potrebbe essere l'immagine docker creata dal Dockerfile di seguito-

FROM ubuntu
ENTRYPOINT echo hello 

Se devi andare al terminale di questa immagine, dovrai mantenere il container in esecuzione modificando il comando entrypoint.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

Dopo aver eseguito normalmente il contenitore con docker run IMAGE_ID, puoi semplicemente andare su un altro terminale e utilizzare docker exec -it CONTAINER_ID bashper ottenere il terminale del contenitore.


"e puoi modificare il Dockerfile": punto chiave qui. Votato.
VonC

0

Nel mio caso, ho cambiato alcuni nomi di file e nomi di directory della directory principale del Dockerfile. A causa di quale contenitore non trova i parametri richiesti per riavviarlo.

Dopo averlo rinominato con i nomi originali, il contenitore è iniziato come il burro.


0

Ho una visione diversa di questo. Potrei fare un docker pse vedere che c'è un container Docker in esecuzione, ho anche provato a riavviarlo, ma non appena ho provato a ottenere una sessione per esso con New-PSSession -ContainerId $containerId -RunAsAdministratoresso si sarebbe verificato un errore, dicendo:

## [errore] New-PSSession: l'input ContainerId xxx non esiste, ## [errore] o il contenitore corrispondente non è in esecuzione.

Il mio problema era che stavo utilizzando il servizio di rete e non disponevo di autorizzazioni sufficienti per visualizzare il contenitore, anche se gli avevo concesso le autorizzazioni per eseguire i comandi docker (con configurazione del gruppo di sicurezza docker)

Non sapevo come abilitare il lavoro con i contenitori, quindi ho dovuto tornare a eseguirlo come utente amministratore

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.