È ansible avviare una sessione di shell in un contenitore in esecuzione (senza ssh)

Mi aspettavo ingenuamente che questo comando eseguisse una shell bash in un contenitore funzionante:

docker run "id of running container" /bin/bash 

sembra che non sia ansible, ottengo l’errore:

 2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842 

Quindi, se voglio eseguire shell bash in un contenitore in esecuzione (ad esempio per scopi di diagnosi)

devo eseguire un server SSH e loggarmi tramite ssh?

EDIT: Ora puoi usare la docker exec -it "id of running container" bash ( doc )

In precedenza, la risposta a questa domanda era:

Se davvero si deve e ci si trova in un ambiente di debug, è ansible farlo: sudo lxc-attach -n Si noti che l’id deve essere quello completo ( docker ps -notrunc ).

Tuttavia, raccomando fortemente contro questo.

avviso: -notrunc è deprecato, sarà presto sostituito da --no-trunc .

Con la finestra mobile 1.3, è disponibile un nuovo comando docker exec . Questo ti permette di inserire una finestra mobile in corso:

 docker exec -it "id of running container" bash 

Basta fare

 docker attach container_name 

Come menzionato nei commenti, per staccare dal contenitore senza fermarlo, digita Ctrl p poi Ctrl q .

Dato che le cose stanno andando d’accordo, al momento il modo consigliato di accedere a un container in esecuzione è l’utilizzo di nsenter .

Puoi trovare ulteriori informazioni su questo repository github . Ma in generale puoi usare nsenter in questo modo:

 PID=$(docker inspect --format {{.State.Pid}} ) nsenter --target $PID --mount --uts --ipc --net --pid 

oppure puoi utilizzare la docker-enter del wrapper: docker-enter :

 docker-enter  

Una bella spiegazione sull’argomento può essere trovata sul blog di Jérôme Petazzoni: Perché non è necessario eseguire sshd nei contenitori docker

La prima cosa che non puoi correre

 docker run "existing container" command 

Poiché questo comando è in attesa di un’immagine e non di un contenitore e comporterebbe comunque la generazione di un nuovo contenitore (quindi non quello che si desidera visualizzare)

Sono d’accordo con il fatto che con docker dovremmo spingerci a pensare in un modo diverso (quindi dovresti trovare dei modi in modo da non dover accedere al contenitore), ma lo trovo comunque utile e questo è il modo in cui lavoro intorno ad esso.

Eseguo i miei comandi tramite supervisore in modalità DEAMON.

Quindi docker_loop.sh ciò che chiamo docker_loop.sh Il contenuto è più o meno questo:

 #!/bin/bash /usr/bin/supervisord /usr/bin/supervisorctl while ( true ) do echo "Detach with Ctrl-p Ctrl-q. Dropping to shell" sleep 1 /bin/bash done 

Quello che fa è che ti permette di “albind” al contenitore e di essere presentato con l’interfaccia supervisorctl per fermare / avviare / riavviare e controllare i registri. Se ciò non dovesse bastare, puoi Ctrl+D e cadrai in una shell che ti permetterà di dare un’occhiata come se fosse un normale sistema.

SI PREGA DI TENERE ANCHE IN ACCOUNT che questo sistema non è sicuro come avere il contenitore senza una shell, quindi prendi tutti i passaggi necessari per proteggere il tuo contenitore.

Tieni d’occhio questa richiesta di pull: https://github.com/docker/docker/pull/7409

Che implementa l’utility di esecuzione della docker exec . Quando questo è disponibile dovrebbe essere ansible, ad esempio, avviare e arrestare il servizio ssh all’interno di un contenitore in esecuzione.

C’è anche nsinit per fare questo: “nsinit fornisce un modo pratico per accedere a una shell all’interno dello spazio dei nomi di un contenitore in esecuzione” , ma sembra difficile essere in esecuzione. https://gist.github.com/ubergarm/ed42ebbea293350c30a6

C’è in realtà un modo per avere una shell nel contenitore.

Supponi che /root/run.sh avvii il processo, il gestore di processi (supervisore) o qualsiasi altra cosa.

Crea /root/runme.sh con alcuni trucchi di gnu-screen:

 # Spawn a screen with two tabs screen -AdmS 'main' /root/run.sh screen -S 'main' -X screen bash -l screen -r 'main' 

Ora avete i vostri demoni nella scheda 0 e una shell intertriggers nella scheda 1. docker attach in qualsiasi momento per vedere cosa succede all’interno del contenitore.

Un altro consiglio è di creare un’immagine “pacchetto di sviluppo” sopra l’immagine di produzione con tutti gli strumenti necessari, inclusa questa schermata.

ecco la mia soluzione

parte di DOckerfile:

 ... RUN mkdir -p /opt ADD initd.sh /opt/ RUN chmod +x /opt/initd.sh ENTRYPOINT ["/opt/initd.sh"] 

parte di “initd.sh”

 #!/bin/bash ... /etc/init.d/gearman-job-server start /etc/init.d/supervisor start #very important!!! /bin/bash 

dopo che l’immagine è stata costruita hai due opzioni usando exec e attach:

  1. con exec (che io uso), esegui:

finestra mobile run –name $ CONTAINER_NAME -dt $ IMAGE_NAME

poi

exec docker -it $ CONTAINER_NAME / bin / bash

e usare

CTRL + D per staccare

  1. con albind, eseguire:

finestra mobile run –name $ CONTAINER_NAME -dit $ IMAGE_NAME

poi

la finestra mobile collega $ CONTAINER_NAME

e usare

CTRL + P e CTRL + Q per staccare

la differenza tra le opzioni è nel parametro -i

Ci sono due modi.

Con allegato

 $ sudo docker attach 665b4a1e17b6 #by ID 

Con exec

 $ sudo docker exec - -t 665b4a1e17b6 #by ID 

Puoi usare

 docker exec -it  bash 

Se l’objective è controllare i registri dell’applicazione, questo post mostra l’avvio di tomcat e lo smistamento del registro come parte di CMD. Il registro tomcat è disponibile sull’host utilizzando ‘docker logs containerid’.

http://blog.trifork.com/2013/08/15/using-docker-to-efficiently-create-multiple-tomcat-instances/

È utile assegnare il nome quando si esegue il contenitore. Non è necessario fare riferimento a container_id.

docker run --name container_name yourimage docker exec -it container_name bash

Forse sei stato in errore come me a pensare in termini di VM quando si sviluppano i contenitori. Il mio consiglio: prova a non farlo

I contenitori sono come qualsiasi altro processo. In effetti si potrebbe voler “albind” a loro per scopi di debug (si pensi a / proc // env o strace -p) ma questo è un caso molto speciale.

Normalmente devi solo “eseguire” il processo, quindi se vuoi modificare la configurazione o leggere i registri, crea un nuovo contenitore e assicurati di scrivere i registri al di fuori di esso condividendo le directory, scrivendo su stdout (in modo che i registri della docker funzionino) o qualcosa di simile.

Per scopi di debug potresti voler avviare una shell, quindi il tuo codice, quindi premere CTRL-p + CTRL-q per lasciare intatto lo shell. In questo modo puoi ricolbind utilizzando:

 docker attach  

Se vuoi eseguire il debug del contenitore perché sta facendo qualcosa che non ti aspetti che faccia, prova a eseguirne il debug: https://serverfault.com/questions/596994/how-can-i-debug-a-docker-container -inizializzazione

No, non è ansible. Usa qualcosa come supervisord per ottenere un server ssh se è necessario. Sebbene, ne dubito decisamente.