GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Comandi Docker CMD e Entrypoint:qual è la differenza?

Introduzione

I container sono progettati per eseguire attività e processi specifici , non per l'hosting di sistemi operativi. Crei un container per servire una singola attività unitaria. Una volta completata l'attività specificata, si interrompe . Pertanto, il ciclo di vita del contenitore dipende dal processo in corso al suo interno. Una volta interrotto il processo, si interrompe anche il contenitore.

Un Dockerfile definisce questo processo. È uno script composto da istruzioni su come creare un'immagine Docker. In questo script ci sono due tipi di istruzioni che può definire il processo in esecuzione nel contenitore:

  • PUNTO DI ENTRATA
  • CMD

In questo articolo spieghiamo le differenze tra Docker ENTRYPOINT e CMD e quando utilizzare quale istruzione Docker.

Docker Entrypoint vs CMD:risolvere il dilemma

In breve, CMD definisce i comandi e/o i parametri predefiniti per un contenitore. CMD è un'istruzione che è meglio usare se hai bisogno di un comando predefinito che gli utenti possono facilmente ignorare. Se un Dockerfile ha più CMD, applica solo le istruzioni dell'ultimo.

D'altra parte, ENTRYPOINT è preferito quando si desidera definire un contenitore con un eseguibile specifico. Non puoi sovrascrivere un ENTRYPOINT quando avvii un container a meno che tu non aggiunga il --entrypoint bandiera.

Combina ENTRYPOINT con CMD se hai bisogno di un contenitore con un eseguibile specificato e un parametro predefinito che può essere modificato facilmente. Ad esempio, durante la containerizzazione di un'applicazione, utilizzare ENTRYPOINT e CMD per impostare variabili specifiche dell'ambiente.

Shell e modulo Exec

Prima di iniziare, è importante discutere le forme delle istruzioni. Docker ENTRYPOINT e CMD possono avere due forme:

  • Modulo shell
  • Modulo di esecuzione

La sintassi per qualsiasi comando in forma di shell è:

<instruction> <command>

La sintassi per le istruzioni in formato exec è:

<instruction> ["executable", "parameter"]

Puoi scrivere istruzioni Docker CMD/ENTRYPOINT in entrambe le forme:

  • CMD echo "Hello World" (forma shell)
  • CMD ["echo", "Hello World"] (modulo esecutivo)
  • ENTRYPOINT echo "Hello World" (forma shell)
  • ENTRYPOINT ["echo", "Hello World"] (modulo esecutivo)

Tuttavia, cerca di conservare tutte le tue istruzioni in modulo exec per prevenire potenziali problemi di prestazioni.

CMD Docker

CMD Docker definisce l'eseguibile predefinito di un'immagine Docker. Puoi eseguire questa immagine come base di un contenitore senza aggiungere argomenti della riga di comando. In tal caso, il contenitore esegue il processo specificato dal comando CMD.

L'istruzione CMD viene utilizzata solo se non sono stati aggiunti argomenti a run comando all'avvio di un container. Pertanto, se si aggiunge un argomento al comando, si sovrascrive il CMD.

Per mostrarti come funziona CMD, creeremo un contenitore di esempio con un'istruzione CMD.

Creazione di un Dockerfile con CMD e creazione di un'immagine

1. Inizia creando un nuovo MyDockerImage cartella in cui archiviare le tue immagini:

sudo mkdir MyDockerImage

2. Spostati in quella cartella e crea un nuovo Dockerfile:

cd MyDockerImage
sudo touch Dockerfile

3. Apri il Dockerfile con il tuo editor di testo preferito:

nano Dockerfile

4. Quindi, aggiungi il seguente contenuto al file:

FROM ubuntu
MAINTAINER sofija
RUN apt-get update
CMD ["echo", "Hello World"]

Nel contenuto sopra, puoi vedere che abbiamo usato l'istruzione CMD per fare eco al messaggio Hello World all'avvio del contenitore senza un comando specificato.

5. Salva e esci il file.

6. Il passaggio successivo consiste nel creare un'immagine Docker dal Dockerfile appena creato. Dal momento che siamo ancora nel MyDockerImage directory, non è necessario specificare la posizione del Dockerfile, basta creare l'immagine eseguendo:

sudo docker build .

7. L'output ti dirà il nome del contenitore. Puoi verificare se è disponibile tra le immagini archiviate localmente eseguendo:

sudo docker images

Esecuzione di un Docker Container con CMD

Per vedere CMD in azione, creeremo un contenitore basato sull'immagine creata nel passaggio precedente.
Esegui il container con il comando:

sudo docker run [image_name]

Poiché non esiste un argomento della riga di comando, il contenitore eseguirà l'istruzione CMD predefinita e visualizzerà il Hello World Messaggio. Tuttavia, se si aggiunge un argomento all'avvio di un contenitore, questo sostituisce l'istruzione CMD.

Ad esempio, aggiungi l'argomento hostname al comando docker run:

sudo docker run [image_name] hostname

Docker eseguirà il contenitore e il hostname comando invece del comando echo del CMD. Puoi vederlo nell'output.

Punto di ingresso Docker

ENTRYPOINT è l'altra istruzione utilizzata per configurare la modalità di esecuzione del contenitore. Proprio come con CMD, devi specificare un comando e parametri.

Qual ​​è la differenza tra CMD e ENTRYPOINT? Non puoi sovrascrivere l'istruzione ENTRYPOINT aggiungendo parametri della riga di comando alla docker run comando. Optando per questa istruzione, implichi che il contenitore è stato creato appositamente per tale uso.

Continua a leggere per vedere come applichiamo ENTRYPOINT nella creazione di container.

Creazione di un Dockerfile con ENTRYPOINT e creazione di un'immagine

1. Utilizzare il Dockerfile creato nella sezione CMD e modificare il file per modificare l'istruzione. Apri il file esistente con un editor di testo:

sudo nano Dockerfile

2. Modifica il contenuto sostituendo il comando CMD con ENTRYPOINT:

FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello World"]

3. Salva e chiudi il file.

Esecuzione di un Docker Container con ENTRYPOINT

1. Crea una nuova immagine usando il seguente comando:

sudo docker build .

2. L'output dovrebbe mostrare che hai creato correttamente la nuova immagine con un determinato nome. Ora eseguiamolo come contenitore senza aggiungere alcun parametro della riga di comando:

sudo docker run [container_name]

L'output sarà lo stesso di CMD. Questo perché non abbiamo aggiunto alcun argomento al comando di esecuzione.

3. Per vedere come funziona ENTRYPOINT, è necessario aggiungere un parametro all'avvio di un container. Usa lo stesso comando del passaggio precedente e aggiungi qualcosa dopo il nome del contenitore:

sudo docker run [container_name] KnowledgeBase

Come vedi, Docker non ha ignorato l'istruzione iniziale di fare eco a Hello World. Ha semplicemente aggiunto il nuovo parametro al comando esistente.

Sebbene tu possa utilizzare ENTRYPOINT e CMD in entrambi i moduli, in genere si consiglia di attenersi al modulo exec . Questa è la soluzione più affidabile poiché la forma della shell può occasionalmente causare problemi sottili nel processo.

Punto di ingresso Docker con CMD

Come hai visto finora, ENTRYPOINT e CMD sono simili, ma non uguali. Inoltre, queste due istruzioni non si escludono a vicenda. Esatto, è possibile averli entrambi nel Dockerfile.

Ci sono molte situazioni in cui la combinazione di CMD e ENTRYPOINT sarebbe la soluzione migliore per il tuo container Docker. In questi casi, l'eseguibile è definito con ENTRYPOINT , mentre CMD specifica il parametro predefinito .

Se stai utilizzando entrambe le istruzioni, assicurati di conservarle in formato exec .

Continua a leggere per vedere come ENTRYPOINT e CMD collaborano nel nostro esempio.

Esegui un container con Entrypoint e CMD

1. Innanzitutto, modificheremo il nostro Dockerfile esistente in modo che includa entrambe le istruzioni. Apri il file con:

sudo nano Dockerfile

2. Il file dovrebbe includere un'istruzione ENTRYPOINT che specifica l'eseguibile, nonché un'istruzione CMD che definisce il parametro predefinito che dovrebbe apparire se non ne vengono aggiunti altri al comando di esecuzione:

FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello"]
CMD ["World"]

3. Ora crea una nuova immagine dal Dockerfile modificato:

sudo docker build . 

4. Testiamo il container eseguendolo senza alcun parametro. Immettere il comando:

sudo docker run [container_name]

Restituirà il messaggio Hello World . Tuttavia, cosa succede quando aggiungiamo parametri al comando docker run?

5. Usa di nuovo lo stesso comando, ma questa volta aggiungi il tuo nome al comando di esecuzione:

sudo docker run [container_name] [your_name]

L'output è ora cambiato in Hello [your_name] (nel mio caso, è Hello Sofija ). Questo perché non puoi sovrascrivere le istruzioni ENTRYPOINT, mentre con CMD puoi farlo facilmente.


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

  2. differenza tra podman e docker.

  3. Alcuni comandi DOCKER

  4. La differenza tra Sudo e Gksu è uguale alla differenza tra Sudo -i e Sudo -s?

  5. La differenza tra CMD e ENTRYPOINT nelle immagini Docker

Immagine Docker vs Container:le principali differenze

Elenco dei comandi Docker:Cheat Sheet

VPN vs VDI:qual è la differenza?

Failover vs. Failback:qual è la differenza

Utilizzo delle istruzioni Dockerfile ENTRYPOINT e CMD

Docker File vs Docker Compose:qual è la differenza?