English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Docker Dockerfile

Cos'è Dockerfile?

Dockerfile è un file di testo utilizzato per costruire un'immagine, il contenuto del file contiene una serie di istruzioni e descrizioni necessarie per costruire l'immagine.

Personalizzazione dell'immagine con Dockerfile

In questo articolo spieghiamo come eseguire il file Dockerfile per personalizzare un'immagine, la dettagliata spiegazione delle istruzioni nel file Dockerfile verrà trattata nel prossimo capitolo, qui devi solo sapere il flusso di costruzione.

1、Esempio di personalizzazione di un'immagine nginx (all'interno dell'immagine costruita ci sarà una /usr/share/nginx/html/index.html File)

In una directory vuota, crea un file chiamato Dockerfile e aggiungi il seguente contenuto:

FROM nginx
RUN echo 'Questo è un'immagine di nginx costruita localmente' > /usr/share/nginx/html/index.html

2, Funzione delle istruzioni FROM e RUN

FROM:Tutte le immagini personalizzate sono basate sull'immagine FROM, qui nginx è l'immagine di base che deve essere personalizzata. Le operazioni successive sono basate su nginx.

RUN:Viene utilizzato per eseguire i comandi della riga di comando seguenti. Ci sono due formati:

Formato shell:

RUN <comando della riga di comando>
# <comando della riga di comando> è equivalente al comando shell eseguito nel terminale.

Formato exec:

# RUN ["file eseguibile", "parametro1", "parametro2"]
# Ad esempio:
# RUN ["./test.php", "dev", "offline"] è equivalente a RUN ./test.php dev offline

Attenzione::Ogni volta che viene eseguito un comando Dockerfile, viene creato uno strato nuovo su Docker. Pertanto, troppi strati senza senso possono causare che l'immagine diventi troppo grande. Ad esempio:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
L'esecuzione di cui sopra creerà 3 strati di immagine. Può essere semplificato nel seguente formato:
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

Come mostrato sopra, i comandi sono collegati dal simbolo &&, in questo modo, dopo l'esecuzione, verrà creato solo uno strato di immagine.

Iniziare a creare l'immagine

Eseguire l'azione di creazione dell'immagine nella directory in cui si trova il file Dockerfile.

Nell'esempio seguente, viene creato un nginx:v3 (nome dell'immagine: etichetta dell'immagine) attraverso il Dockerfile nella directory.

Nota:L'ultimo . rappresenta il percorso contestuale dell'esecuzione attuale, che verrà introdotto nella prossima sezione.

$ docker build -t nginx:v3 .

Come mostrato di seguito, indica che la creazione dell'immagine è stata eseguita con successo.

Il percorso contestuale

Nella sezione precedente, è stato menzionato che l'ultimo . è il percorso contestuale, allora cosa è il percorso contestuale?

$ docker build -t nginx:v3 .

Il percorso contestuale, è il percorso che Docker utilizza durante la creazione dell'immagine, a volte desideriamo utilizzare i file locali (ad esempio, copiare), quando Docker build riceve questo percorso, impacchetterà tutto il contenuto del percorso.

解析:Poiché il modello di esecuzione di Docker è C/S. Noi siamo il C, il motore Docker è il S. Il processo di costruzione effettivo viene completato sotto il motore Docker, quindi in questo momento non possiamo utilizzare i file del nostro computer. Questo richiede di pacchettare insieme i file del nostro percorso di directory specifico e fornirli al motore Docker per l'uso.

Se l'ultimo parametro non è specificato, il percorso di contesto predefinito è la posizione del Dockerfile.

Attenzione::Non mettere file inutili nel percorso di contesto, poiché questi vengono inviati insieme al motore Docker, e un numero eccessivo di file può rallentare il processo.

Dettagli dell'istruzione

COPY

Istruzione di copia, copia file o directory dal percorso di contesto al percorso specificato nel container.

Formato:

COPY [--chown=<user>:<group>] <percorso_sorgente1>...  <percorso_destinazione>
COPY [--chown=<user>:<group>] ["<percorso_sorgente1>",...  "<percorso_destinazione>"]

[--chown=<user>:<group>]:Parametro opzionale, modificare il proprietario e il gruppo del file copiato nel container.

<percorso_sorgente>:File sorgente o directory sorgente, qui può essere un'espressione di jolly, le regole del jolly devono soddisfare le regole Go filepath.Match. Ad esempio:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<percorso_destinazione>:Percorso specificato all'interno del container, questo percorso non deve essere creato in anticipo, se non esiste viene creato automaticamente.

ADD

Il formato di utilizzo dell'istruzione ADD è lo stesso di quello di COPY (l'ufficio consiglia di utilizzare COPY nelle stesse esigenze). Le funzioni sono simili, ma ci sono differenze come segue:

  • Vantaggio di ADD: Se <file_sorgente> è un file compresso in formato tar, e il formato di compressione è gzip, bzip2 o xz, viene copiato e scompattato automaticamente in <percorso_destinazione>.

  • Svantaggio di ADD: Senza scompattamento, non è possibile copiare file compressi in formato tar. Può invalidare la cache di costruzione dell'immagine, il che potrebbe rendere la costruzione dell'immagine più lenta. La decisione di utilizzarlo dipende dalla necessità di scompattamento automatico.

CMD

Simile al comando RUN, utilizzato per eseguire programmi, ma i due punti di esecuzione sono diversi:

  • CMD viene eseguito durante docker run.

  • RUN è eseguito durante docker build.

FunzioneSpecificare il programma predefinito da eseguire nel container avviato. Quando il programma termina, il container termina anche. Il programma specificato dal comando CMD può essere sovrascritto dai parametri del comando docker run.

Attenzione:Se esiste più di un comando CMD nel Dockerfile, solo l'ultimo è efficace.

Formato:

CMD <comando shell> 
CMD ["<file eseguibile o comando>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...] # Questa scrittura è per fornire parametri predefiniti all'istruzione ENTRYPOINT

Si consiglia di utilizzare la seconda forma, che ha un processo di esecuzione più chiaro. La prima forma viene automaticamente convertita in seconda forma durante l'esecuzione e il file eseguibile predefinito è sh.

ENTRYPOINT

Simile all'istruzione CMD, ma non viene coperta dall'istruzione specificata dai parametri della riga di comando docker run, e questi parametri vengono inviati come parametri all'istruzione specificata da ENTRYPOINT.

Ma, se si utilizza l'opzione --entrypoint durante l'esecuzione di docker run, sovrascriverà l'istruzione CMD specificata.

Vantaggi:: Durante l'esecuzione di docker run, è possibile specificare i parametri necessari per l'ENTRYPOINT.

Attenzione:: Se ci sono più istruzioni ENTRYPOINT nel Dockerfile, solo l'ultima è efficace.

Formato:

ENTRYPOINT ["<eseguibile>","<param1>","<param2>",...]

Può essere abbinato all'istruzione CMD: di solito CMD viene utilizzato quando si utilizzano variabili, qui CMD è equivalente a passare parametri a ENTRYPOINT, e l'esempio menzionato seguirà.

Esempio:

Supponiamo che l'immagine nginx:test sia stata creata tramite Dockerfile:

FROM nginx
ENTRYPOINT ["nginx", "-c"] # Parametro
CMD ["/etc/nginx/nginx.conf"] # Variabile

1、Esegui senza parametri

$ docker run nginx:test

All'interno del container verranno eseguiti i seguenti comandi predefiniti, avviando il processo principale.

nginx -c /etc/nginx/nginx.conf

2、Esegui con parametri

$ docker run nginx:test -c /etc/nginx/new.conf

All'interno del container verranno eseguiti i seguenti comandi predefiniti, avviando il processo principale (/etc/nginx/new.conf: supponiamo che il file esista già nel container)

nginx -c /etc/nginx/new.conf

ENV

Impostare le variabili di ambiente, definire le variabili di ambiente, allora possono essere utilizzate queste variabili di ambiente nelle istruzioni successive.

Formato:

ENV <key> <value>
ENV <chiave1>=<valore1> <chiave2>=<valore2>...

Esempio di configurazione seguente: SET NODE_VERSION = 7.2.0, che può essere richiamato tramite $NODE_VERSION nelle istruzioni successive:

ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

ARG

Parametro di costruzione, con lo stesso effetto di ENV. Tuttavia, l'ambito è diverso. L'ambiente variabile impostato da ARG è valido solo all'interno del Dockerfile, ovvero è valido solo durante il processo di costruzione docker build, non esiste questo ambiente variabile nell'immagine costruita.

Può essere utilizzato --build-arg <nomeParametro>=<valore> nel comando di costruzione docker build per sovrascrivere.

Formato:

ARG <nomeParametro>[=<valorePredefinito>]

VOLUME

Definire il volume dati anonimo. Se si dimentica di mount il volume dati durante l'avvio del container, verrà automaticamente mountato sul volume anonimo.

Funzione:

  • Evitare che i dati importanti vengano persi a causa del riavvio del container, il che è molto fatale.

  • Evitare che il container continui a crescere.

Formato:

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

Durante l'avvio del container docker run, possiamo modificare il punto di mount tramite il parametro -v.

EXPOSE

Declarare solo la porta.

Funzione:

  • Aiuta l'utente dell'immagine a comprendere il porto di守护 di questo servizio di immagine, rendendo più facile configurare la mappatura.

  • In caso di mappatura di porta casuale durante l'esecuzione, ossia docker run -P, i porti EXPOSE verranno mappati automaticamente in modo casuale.

Formato:

EXPOSE <porta1> [<porta2>...]

WORKDIR

Specificare il directory di lavoro. Il directory di lavoro specificato con WORKDIR esisterà in ogni strato della costruzione dell'immagine.(Il directory di lavoro specificato con WORKDIR deve essere creato in anticipo)。

In fase di costruzione dell'immagine docker, ogni comando RUN è uno strato nuovo. Solo i directory creati tramite WORKDIR esisteranno sempre.

Formato:

WORKDIR <路径目录工作>

USER

Utilizzato per specificare l'utente e il gruppo di utenti che eseguiranno i comandi successivi, in questo caso viene solo切换后续命令执行的用户(用户和用户组必须提前已经存在)。

Formato:

USER <Nome utente>[:<Gruppo utente>]

HEALTHCHECK

Usato per specificare un programma o un comando per monitorare lo stato di esecuzione del servizio di container Docker.

Formato:

HEALTHCHECK [Opzioni] CMD <Comando>:Imposta il comando per controllare la salute del container
HEALTHCHECK NONE:Se l'immagine di base ha un comando di controllo della salute, questa riga può disabilitare il comando di controllo della salute.
HEALTHCHECK [Opzioni] CMD <Comando> : Il comando seguito da CMD può essere utilizzato come riferimento all'uso di CMD.

ONBUILD

Usato per ritardare l'esecuzione dei comandi di costruzione. In altre parole, i comandi specificati con ONBUILD nel Dockerfile non vengono eseguiti durante il processo di costruzione dell'immagine (supponiamo che l'immagine sia test-build). Quando un nuovo Dockerfile utilizza l'immagine precedentemente costruita FROM test-build, durante la costruzione dell'immagine nuova, vengono eseguiti i comandi ONBUILD specificati nel Dockerfile di test-build.

Formato:

ONBUILD <Altri comandi>