Il CMD
e ENTRYPOINT
le istruzioni sono due Dockerfile
comunemente confuse direttive. Entrambi hanno un ruolo nel determinare il comando che verrà eseguito all'avvio del contenitore.
Il CMD
e ENTRYPOINT
può essere sovrascritto individualmente all'interno di ogni immagine. L'uso efficace di queste direttive semplifica l'uso del tuo contenitore riducendo la lunghezza dei comandi che fornisci.
Che cos'è il punto di ingresso?
Esamineremo ENTRYPOINT
prima poiché viene elaborato prima di CMD
quando si avvia un nuovo contenitore. Il punto di ingresso dell'immagine definisce il processo che verrà eseguito all'avvio del contenitore.
Docker imposta il punto di ingresso su /bin/sh -c
. Ciò significa che ti ritroverai in una sessione di shell quando avvii il contenitore. Per molti contenitori, è preferibile avviare un processo diverso per impostazione predefinita. Vuoi che i servizi headless inizino immediatamente il loro carico di lavoro.
Impostazione del ENTRYPOINT
direttiva in un Dockerfile
indica a Docker di eseguire un comando specifico all'avvio del contenitore. Diventerà il processo in primo piano, invece della sessione di shell predefinita.
ENTRYPOINT ["date"]
Un contenitore creato con questo Dockerfile
eseguirà la date
comando. Come date
non è un processo in primo piano di lunga durata, il contenitore uscirà immediatamente dopo.
I punti di ingresso devono essere binari o script eseguibili. Il tuo container non si avvierà se specifichi un punto di ingresso non valido. Se stai utilizzando uno script personalizzato, assicurati che sia impostato il bit eseguibile. Puoi aggiungere i permessi di esecuzione usando chmod +x my-script.sh
.
Aggiunta del comando (CMD)
Il CMD
l'istruzione è una specie di termine improprio. Fornisce argomenti predefiniti per il comando definito da ENTRYPOINT
.
ENTRYPOINT ["date"] CMD ["+%A"]
Questo esempio risulta nel contenitore che esegue date +%A
. Il +%A
argomento in date
visualizza il giorno della settimana corrente (ad es. Monday
).
CMD
è progettato per essere sovrascritto. docker run
ti consente di specificare un comando diverso per una singola istanza del contenitore:
docker run my-image +%B
Il CMD
predefinito verrà sovrascritto con +%B
, facendo in modo che il contenitore visualizzi il nome del mese corrente. Funziona perché il punto di ingresso dell'immagine rimane intatto. Il CMD
viene sempre aggiunto al ENTRYPOINT
, quindi il comando finale diventa date +%B
.
Dovresti usare ENTRYPOINT
per definire l'eseguibile principale del tuo contenitore. Usa CMD
per definire argomenti predefiniti per quell'eseguibile. Verrà sovrascritto quando il contenitore viene eseguito con argomenti diversi.
Sostituzioni dei punti di ingresso
Puoi forzare Docker ad avviare un'immagine utilizzando un punto di ingresso personalizzato. Supera il --entrypoint
contrassegnare su docker run
:
docker run --entrypoint /bin/sh my-image
Il punto di ingresso definito nell'immagine del contenitore verrà ignorato a favore del comando che hai specificato. Nel nostro esempio, verrà avviata una sessione di shell, invece della date
comando.
L'override dei punti di ingresso dovrebbe essere un evento raro. Può andare contro le intenzioni dell'autore dell'immagine. Tuttavia, l'impostazione di un punto di ingresso personalizzato può essere utile, in particolare durante il debug. Se un container si comporta in modo anomalo, l'override del suo punto di ingresso può concederti un accesso alla shell che altrimenti non potresti ottenere.
Quale usare?
Se sei un autore di immagini, dovresti utilizzare ENTRYPOINT
quando si definisce cosa verrà eseguito il container. Se desideri fornire argomenti predefiniti, ma ti aspetti che l'utente li sovrascriva, includi CMD
anche.
Come utente di immagini, normalmente puoi continuare a sovrascrivere CMD
. docker run
ha un supporto trasparente per le sostituzioni dei comandi. Qualsiasi argomento fornito dopo il nome dell'immagine verrà interpretato come CMD
stringa per il contenitore.
Modalità entrypoint:Shell o Exec
Docker in realtà supporta due diverse forme di ENTRYPOINT
:modalità exec e modalità shell. La modalità Exec è caratterizzata dall'uso di un costrutto array per specificare i parametri. In modalità shell, il comando è specificato come una stringa.
# exec mode ENTRYPOINT ["binary", "--param", "--another-param"] # shell mode ENTRYPOINT binary --param --another-param
L'uso della modalità shell fa sì che il tuo binario venga eseguito come un sottoprocesso di /bin/sh -c
. Questo dà al tuo punto di ingresso l'accesso alle variabili d'ambiente definite dalla shell.
Tuttavia, la modalità Shell ha dei compromessi. Non puoi usare CMD
quindi gli utenti non saranno in grado di emettere sostituzioni. Argomenti forniti a docker run
sarà ignorato; il tuo container utilizzerà sempre il punto di ingresso così com'è.
Poiché il tuo file binario viene eseguito all'interno di una shell, i comandi del ciclo di vita di Docker come docker stop
potrebbe funzionare in modo irregolare o non funzionare affatto. Docker segnalerà la shell fermare, invece del processo interno. Puoi avviare il processo con exec
per evitarlo.
ENTRYPOINT exec binary --param --another-param
Vantaggi dell'approccio Docker's Entrypoint
Separare il punto di ingresso dai suoi argomenti ti aiuta a nascondere la complessità nei tuoi contenitori. Questo è particolarmente vantaggioso quando crei contenitori di utilità per incapsulare programmi CLI.
Imposta il file binario della tua CLI come punto di ingresso dell'immagine. Ciò consente agli utenti di interagire senza ripetere il nome binario in ogni comando.
Considera se abbiamo impacchettato il Dockerfile
sopra come date:latest
:
# default entrypoint (/bin/sh -c) docker run date:latest date +%A # with `date` as the entrypoint docker run date:latest +%A`
L'impostazione di un punto di ingresso personalizzato riduce i comandi e le ripetizioni. Il contenitore diventa più specializzato invocando date
automaticamente. Questo crea un'interfaccia più amichevole per i tuoi utenti.
Riepilogo
ENTRYPOINT
di Docker e CMD
le istruzioni sono una frequente fonte di confusione. La loro denominazione maschera gli scopi previsti.
Usa ENTRYPOINT
per impostare il "comando" che verrà eseguito all'avvio di nuovi contenitori. Puoi definire argomenti predefiniti usando CMD
. ENTRYPOINT
e CMD
vengono combinati insieme per produrre la stringa di comando finale del contenitore.
Quando usi docker run
, Docker sostituisce il CMD
predefinito dell'immagine con gli argomenti da te specificati. Se devi sovrascrivere il punto di ingresso di un'immagine, usa il --entrypoint
bandiera.