GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

La differenza tra CMD e ENTRYPOINT nelle immagini Docker

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.


Docker
  1. Qual è la differenza tra InnoDB e MyISAM?

  2. Qual è la differenza tra i container LXC, LXD e Docker

  3. Qual è la differenza tra un container Linux e un'immagine?

  4. Qual è la differenza tra Sudo Su – e Sudo Su –?

  5. La differenza tra Nss e Pam?

Comandi Docker CMD e Entrypoint:qual è la differenza?

La differenza tra sudo e su spiegata

Come aggiornare l'immagine Docker e il contenitore all'ultima versione

Utilizzo delle istruzioni Dockerfile ENTRYPOINT e CMD

Come copiare file tra host e contenitore Docker

Qual è la differenza tra unlink e rm?