Docker Exec: Il tuo comando principale per eseguire comandi in Docker


Hai mai avuto bisogno di vedere cosa succede all’interno di un contenitore Docker? I contenitori sono progettati per essere idempotenti: se c’è un problema, rilancia un nuovo contenitore. Spesso la vita non è così semplice. È necessario eseguire comandi nel contenitore per identificare il problema. È qui che il comando docker exec può essere utile.

Questo articolo ti insegnerà come eseguire comandi su un contenitore Docker in esecuzione usando il comando docker exec.

Prerequisiti

Per seguire gli esempi in questo articolo, è necessario attenersi ai seguenti requisiti.

  • Qualsiasi versione recente di Docker Desktop funzionerà su Windows, Linux o macOS. Questo tutorial utilizza la versione 3.1.0 in esecuzione su Windows 10.

Avviare un contenitore NGINX

Docker exec esegue comandi nei contenitori. Ma, per fare ciò, devi prima avere un contenitore in cui eseguire quei comandi. Iniziamo scaricando un’immagine Docker e creando un contenitore demo.

  1. Crea una nuova directory, questo tutorial utilizza C:\gitrepos\test, per contenere i file utilizzati per il contenitore.

2. Creare un file chiamato dockerfile (senza estensione), contenente il seguente codice. Il Dockerfile definisce i passaggi necessari per creare un container.

FROM nginx:alpine
 COPY index.html /usr/share/nginx/html/index.html

3. Successivamente, creare un file, nella stessa directory, chiamato index.html che contiene il seguente codice. Questo è un file HTML che, quando il container viene avviato, mostrerà un messaggio di Hello World.

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Hello World - Nginx Docker</title> 
    <style> 
       h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif; 
       } 
    </style> 
    </head> 
    <body> 
       <h1> 
          Hello World 
       </h1> 

    </body> 
    </html>

4. Ora creare il container Docker di Nginx. Poiché il Dockerfile si trova nella directory di lavoro corrente, specificare . per far sapere al motore Docker di cercare lì. Assicurarsi inoltre di contrassegnare il container con my-nginx utilizzando il parametro t per facilitare il riferimento futuro.

docker build -t my-nginx .
Creating a Docker container with the build command.

5. Ora che il container è stato creato, avviare il container con il comando Docker run.

# rm - Informa Docker di eliminare il container dopo che si è arrestato 
# d - Restituisce il controllo della riga di comando dopo che il comando è stato eseguito 
# p - Mappa la porta interna del container 80 a una porta esterna 80 docker run --rm -d -p 80:80 my-nginx
Start the container with the Docker run command.

6. Infine, aprire il browser web e navigare su http://localhost/ per visualizzare quanto segue.

Output of the running NGINX container.

Esecuzione di comandi con Docker Exec

Quando si eseguono comandi in un container Docker, potrebbe essere necessario eseguirli interattivamente. L’esecuzione interattiva implica l’inserimento di un comando, ricevere feedback, inserire un altro comando, ecc. I comandi interattivi prendono il controllo della sessione e impediscono di fare qualsiasi altra cosa.

Ma se si conoscono già i comandi da inviare al container in anticipo e si desidera eseguire comandi in background, è possibile eseguire comandi non interattivi. I comandi non interattivi consentono di inviare un comando a Docker e restituire immediatamente il controllo della console.

Trovare il Nome e l’ID del Container

Ora che hai costruito il container, puoi eseguire comandi al suo interno. Prima di eseguire un comando, individua il nome o l’ID del container NGINX. Sia il nome che l’ID funzioneranno nei comandi Docker. Tieni presente che ricordare l’ID potrebbe essere più difficile rispetto al nome!

Per visualizzare le informazioni su qualsiasi container in esecuzione, esegui il comando Docker ps per ottenere le seguenti informazioni.

docker ps
Displaying running Docker containers.

Copia l’ID univoco, e17e4b6be01a, o il nome generato casualmente mystifying_chandrasekhar negli appunti per un uso successivo.

Esecuzione di un Comando Non Interattivo con Docker Exec

Come esempio di esecuzione di un comando non interattivo, copia e esegui il comando sottostante per restituire un elenco di file nella directory /var/log con il comando ls -l. Passa tutto dopo il nome del container, mystifying_chandrasekhar, al comando Docker exec.

docker exec mystifying_chandrasekhar ls -l /var/log
Executing a directory listing within the NGINX container.

Avoidare l’output della console con i comandi Docker

Restituendo immediatamente il controllo della shell all’utente, le operazioni di grandi dimensioni evitano di bloccare la console. Omettere l’output della console con l’opzione d distaccata. Il comando sottostante crea il file /tmp/execWorks tramite il comando touch all’interno del contenitore e non mostra alcun output sulla console.

docker exec -d mystifying_chandrasekhar touch /tmp/execWorks

Eseguire comandi interattivi con Docker Exec

Fino a questo punto, hai imparato come eseguire comandi non interattivi in un contenitore Docker con docker exec. Ma potresti trovarsi di fronte a un momento in cui devi risolvere i problemi di un contenitore, ad esempio, quando è necessario impartire comandi al contenitore in modo interattivo. In tal caso, è necessario eseguire comandi in modo interattivo.

Eseguire comandi in modo interattivo con docker exec richiede due opzioni, i e t. L’opzione i mantiene aperto STDIN, consentendo l’invio di comandi al contenitore, e l’opzione talloca un pseudo-TTY (PTY), un canale di comunicazione, per digitare comandi.

Copia e incolla il seguente comando per aprire un prompt dei comandi interattivo al contenitore Docker in esecuzione con la shell Bourne (sh), come indicato dal cambio del prompt a / #.

docker exec -it mystifying_chandrasekhar sh
Running an interactive Docker shell.

Una volta nella shell, esegui ora i comandi sottostanti per dimostrare l’elenco dei file da all’interno del contenitore. Infine, esegui il comando exit per lasciare la shell interattiva.

ls -l /var/log
exit
Open an interactive command prompt to the container.

Per aprire un prompt interattivo in una directory specifica, passa il percorso all’opzione w indicando a Docker di avviare la shell in una directory specificata.

Passaggio di Variabili Ambientali a un Container in Esecuzione

Molti programmi utilizzano le variabili ambientali per impostare configurazioni all’avvio. Ad esempio, la maggior parte delle applicazioni Java richiede che la variabile ambientale JAVA_HOME sia impostata sul percorso di Java.

Puoi passare le variabili ambientali a una sessione utilizzando l’opzione e. Ad esempio, forse devi popolare una variabile ambientale chiamata MYVAR in un container in esecuzione. Per farlo, utilizza l’opzione e e fornisci la coppia chiave/valore di MYVAR="<some value>" come mostrato di seguito.

docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Pass environment variables

Passaggio delle Variabili Ambientali Con un File

Se hai molte variabili ambientali o una configurazione condivisa, memorizzare tali variabili in un file potrebbe essere più semplice. Passa il file tramite un percorso relativo o assoluto a Docker con l’opzione --env-file. Questa tecnica viene spesso utilizzata per fornire credenziali sicure a un container. Assicurati di non inserire mai credenziali nel controllo delle versioni!

Crea un file di testo chiamato env-vars.txt con le variabili ambientali da passare e i loro valori. Questo file può essere chiamato come preferisci e non ha bisogno dell’estensione del file .txt.

Text file with environmental variables defined.

Passa le variabili ambientali a Docker con l’opzione env-file. Verifica che le variabili siano disponibili con il comando echo come mostrato nella schermata sottostante.

# Passare il file env-vars.txt e aprire un prompt interattivo
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Verificare che le variabili ambientali siano disponibili nel container Docker
echo $MYVAR
echo $FOO
echo $SOMETHING
Passing a environmental variables file to Docker and verifying the environment variables exist in the container.

Interagire con un container in esecuzione come un utente diverso

In produzione, le applicazioni spesso vengono eseguite come utente specifico per limitarne l’accesso. Se si eseguono applicazioni come utente specifico in produzione, si dovrebbe fare lo stesso durante il test dei comandi.

In questo esempio, il container Docker viene eseguito come utente nginx. Passare l’utente all’opzione w per dire a Docker di avviare il container come account nginx. Il comando whoami, eseguito all’interno del container, conferma che l’utente nginx viene effettivamente utilizzato.

docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Running the container as the nginx user.

Passaggi successivi

Hai imparato come eseguire comandi all’interno di un container in esecuzione utilizzando il comando docker exec. Utilizzando il comando exec per accedere e interrogare i container in esecuzione, hai uno strumento potente nel tuo arsenale per risolvere i problemi dei container Docker.

Ora prova a portare ciò che hai imparato un passo più avanti e usa il controllo di versione Git per tirare un sito web statico nel container, anziché copiare un singolo file. Se Git è nuovo per te, allora l’articolo Guida per principianti a Visual Studio Code e Git è un ottimo punto di partenza.

Source:
https://adamtheautomator.com/docker-exec/