Come posso ignorare CMD quando eseguo un'immagine docker?


123

Voglio ispezionare un'immagine docker creata da qualcun altro con sia un punto di accesso che un cmd specificati, ad esempio:

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

Attualmente faccio:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

C'è un modo per sovrascrivere CMD in modo che sia vuoto (quindi non devo usare "--login")?

Risposte:


126

Puoi semplicemente entrare tramite docker run -it --entrypoint=/bin/bash $IMAGE -i(lancerai un nuovo contenitore dall'immagine e otterrai una shell bash in modalità interattiva), quindi esegui il comando entrypoint in quel contenitore.

È quindi possibile ispezionare il contenitore in esecuzione nello stato in cui dovrebbe essere in esecuzione.

EDIT: da Docker 1.3 è possibile utilizzare execper eseguire un processo in un container in esecuzione. Avvia il contenitore come faresti normalmente, quindi immettilo emettendo:

docker exec -it $CONTAINER_ID /bin/bash

Supponendo che bash sia installato, ti verrà dato l'accesso alla shell al container in esecuzione.


Non eseguirà "/ usr / sbin / apache2ctl / bin / bash"? (poiché il tuo esempio non sostituisce il punto di accesso utilizzerà il punto di accesso definito nel Dockerfile - o mi sto perdendo qualcosa?)
deforma

È forse qualcosa di diverso per le versioni docker più vecchie / più recenti? Certamente gestisce l'entrata per me: gist.github.com/warpr/26a5cc471dce7fcf9021 . Questo sta usando la finestra mobile 0.10.0 su Ubuntu 13.10.
ordito

4
So che passa - il punto centrale ignora il punto d'accesso. Ma quando uso --entrypoint, come posso sovrascrivere CMD per essere vuoto? (Per bash posso usare qualcosa come -i o --login, ma non tutti gli ingressi che potrei voler usare avranno un argomento "fittizio" equivalente).
ordito

1
Almeno in Docker v1.11.1 sembra che l'override del --entrypoint impedisca anche il normale accodamento del CMD al punto di accesso. Ciò sembra accadere solo quando il punto di accesso non viene ignorato.
Jasmine Hegman,

1
Perché c'è un -idopo $IMAGE?
Eyal Levin,

27

Vedi: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

Parte pertinente:

CMD (comando o opzioni predefiniti) Richiama il COMANDO facoltativo nella riga di comando Docker:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

Questo comando è facoltativo perché la persona che ha creato l'IMMAGINE potrebbe aver già fornito un COMANDO predefinito utilizzando la CMD Dockerfile. Come operatore (la persona che esegue un contenitore dall'immagine), puoi ignorare quel CMD semplicemente specificando un nuovo COMANDO.

Se l'immagine specifica anche un ENTRYPOINT, CMD o COMMAND vengono aggiunti come argomenti a ENTRYPOINT.

Quindi per fare quello che vuoi devi solo specificare un cmd e sovrascrivere usando /bin/bash. Non del tutto "vuoto", ma ottiene il lavoro fatto al 99%.


Oops, ho trascurato un dettaglio. Fatta eccezione per accorciare --loginal -lCredo che la soluzione è già buono come si arriva.
Simon Thum,

Ecco una cosa divertente che ho visto oggi: il comando non è ignorato, è stato aggiunto. Ecco il PS dall'interno del contenitore. Si noti che il comando che ho aggiunto era echo "impostazione del db" e il comando incorporato è / usr / bin / geth. Inoltre ho impostato entrypoint su "". 1 ? Ssl 0:00 /usr/bin/geth echo setting up db
Paul S,

Il collegamento di riferimento alla finestra mobile non funziona più, non è possibile trovare un ovvio sostituto per esso.
Chris Kimpton,

L'ho appena risolto, ma ho anche trovato difficile da trovare; (
Simon Thum,

15

Per chiunque venga qui per sovrascrivere il comando entrypoint AND per passare altri comandi, ad esempio eseguire bash invece dello script entrypoint e quindi eseguire altri comandi con parametri (non mi era chiaro dalle altre risposte):

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...'è un parametro per /bin/shcui qui è possibile passare qualsiasi comando che si desidera eseguire nel contenitore. /bin/shè per le immagini alpine, /bin/bashmolto probabilmente per altre immagini.


1
solo i comandi di una shell di aggiunta dovrebbero essere scritti in base a json, quindi invece di quotare con virgolette singole '...'utilizzare le virgolette doppie"..."
Jimmy Obonyo Abor

O semplicemente passa tutti gli argomenti - centrypoint che vuoi
Nick Roz il

questo sembra non funzionare: "exec: \" - c \ ": file eseguibile non trovato in $ PATH": sconosciuto.
Richard,

Controlla il percorso nel contenitore, forse in realtà non esiste. La maggior parte delle immagini ha, /bin/shma le tue potrebbero non essere così.
Informazioni dal
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.