Dockerfile in Windows

Il motore Docker include strumenti che automatizzano la creazione di immagini del contenitore. Anche se è possibile creare immagini contenitore manualmente eseguendo il comando, l'adozione docker commit di un processo di creazione automatica delle immagini offre molti vantaggi, tra cui:

  • Archiviazione di immagini contenitore come codice.
  • Ricreazione rapida e precisa delle immagini contenitore ai fini della manutenzione e dell'aggiornamento.
  • Integrazione continua tra le immagini contenitore e il ciclo di sviluppo.

I componenti di Docker che gestiscono l'automazione sono Dockerfile e il comando docker build.

Dockerfile è un file di testo che contiene le istruzioni necessarie per creare una nuova immagine del contenitore. Queste istruzioni includono l'identificazione di un'immagine esistente da usare come base, i comandi da eseguire durante il processo di creazione delle immagini e un comando che verrà eseguito quando si distribuiscono nuove istanze dell'immagine contenitore.

La compilazione Docker è il comando del motore Docker che usa un Dockerfile e attiva il processo di creazione dell'immagine.

Questo argomento illustra come usare Dockerfile con contenitori Windows, comprendere la sintassi di base e quali sono le istruzioni Dockerfile più comuni.

Questo documento illustra il concetto di immagini contenitore e livelli di immagine del contenitore. Per altre informazioni sulle immagini e sul layering delle immagini, vedere immagini di base del contenitore.

Per un'occhiata completa a Dockerfiles, vedere il riferimento a Dockerfile.

Sintassi di base

Il formato di base di un Dockerfile può essere molto semplice. Nell'esempio seguente si crea una nuova immagine, inclusi IIS e un sito "hello world". Questo esempio include commenti (indicati con un #), che descrivono ogni passaggio. Le sezioni successive di questo articolo illustreranno in dettaglio le regole di sintassi e le istruzioni Dockerfile.

Nota

Un Dockerfile deve essere creato senza estensione. A tale scopo in Windows, creare il file con l'editor scelto, quindi salvarlo con la notazione "Dockerfile" (incluse le virgolette).

# Sample Dockerfile

# Indicates that the windowsservercore image will be used as the base image.
FROM mcr.microsoft.com/windows/servercore:ltsc2019

# Metadata indicating an image maintainer.
LABEL maintainer="jshelton@contoso.com"

# Uses dism.exe to install the IIS role.
RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart

# Creates an HTML file and adds content to this file.
RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html

# Sets a command or process that will run each time a container is run from the new image.
CMD [ "cmd" ]

Per altri esempi di Dockerfiles per Windows, vedere il repository Dockerfile for Windows.

Istruzioni

Le istruzioni di Dockerfile forniscono al motore Docker le istruzioni necessarie per creare un'immagine del contenitore. Queste istruzioni vengono eseguite uno per uno e in ordine. Gli esempi seguenti sono le istruzioni più comunemente usate in Dockerfiles. Per un elenco completo delle istruzioni di Dockerfile, vedere il riferimento a Dockerfile.

FROM

L'istruzione FROM imposta l'immagine contenitore che verrà usata durante il processo di creazione di una nuova immagine. Ad esempio, quando si usa l'istruzione FROM mcr.microsoft.com/windows/servercore, l'immagine risultante deriva e presenta una dipendenza dall'immagine del sistema operativo di base di Windows Server Core. Se l'immagine specificata non è presente nel sistema in cui viene eseguito il processo di compilazione Docker, il motore Docker tenterà di scaricare l'immagine da un registro di immagini pubblico o privato.

Il formato dell'istruzione FROM è simile al seguente:

FROM <image>

Ecco un esempio del comando FROM:

Per scaricare il core windows server della versione ltsc2019 dal Registro Contenitori Microsoft:

FROM mcr.microsoft.com/windows/servercore:ltsc2019

Per informazioni più dettagliate, vedere il riferimento FROM.

ESEGUI

L'istruzione RUN specifica i comandi da eseguire e acquisire nella nuova immagine contenitore. Questi comandi possono includere elementi, tra cui l'installazione di software, la creazione di file e directory e la creazione della configurazione dell'ambiente.

L'istruzione RUN è simile alla seguente:

# exec form

RUN ["<executable>", "<param 1>", "<param 2>"]

# shell form

RUN <command>

La differenza tra il modulo exec e shell è il modo in cui viene eseguita l'istruzione RUN . Quando si usa il formato exec, il programma specificato viene eseguito in modo esplicito.

Ecco un esempio del modulo exec:

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN ["powershell", "New-Item", "c:/test"]

L'immagine risultante esegue il powershell New-Item c:/test comando:

docker history doc-exe-method

IMAGE               CREATED             CREATED BY                    SIZE                COMMENT
b3452b13e472        2 minutes ago       powershell New-Item c:/test   30.76 MB

Al contrario, nell'esempio seguente viene eseguita la stessa operazione nel formato shell:

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell New-Item c:\test

L'immagine risultante ha un'istruzione di esecuzione di cmd /S /C powershell New-Item c:\test.

docker history doc-shell-method

IMAGE               CREATED             CREATED BY                              SIZE                COMMENT
062a543374fc        19 seconds ago      cmd /S /C powershell New-Item c:\test   30.76 MB

Considerazioni sull'uso di RUN con Windows

Quando si usa l'istruzione RUN con il formato exec in Windows, devono essere usati caratteri di escape per le barre rovesciate.

RUN ["powershell", "New-Item", "c:\\test"]

Quando il programma di destinazione è un programma di installazione di Windows, è necessario estrarre il programma di installazione tramite il /x:<directory> flag prima di poter avviare la procedura di installazione effettiva (invisibile all'utente). È anche necessario attendere l'uscita del comando prima di eseguire qualsiasi altra operazione. In caso contrario, il processo termina prematuramente senza installare nulla. Per informazioni dettagliate, vedere l'esempio riportato di seguito.

Esempi di uso di RUN con Windows

Nell'esempio seguente Dockerfile usa DISM per installare IIS nell'immagine del contenitore:

RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart

Questo esempio installa il pacchetto ridistribuibile di Visual Studio. Start-Process e il -Wait parametro viene usato per eseguire il programma di installazione. Ciò garantisce che l'installazione venga completata prima di passare all'istruzione successiva nel Dockerfile.

RUN powershell.exe -Command Start-Process c:\vcredist_x86.exe -ArgumentList '/quiet' -Wait

Per informazioni dettagliate sull'istruzione RUN, vedere il riferimento RUN.

COPIA

L'istruzione COPY copia file e directory nel file system del contenitore. I file e le directory devono trovarsi in un percorso relativo al Dockerfile.

Il COPY formato dell'istruzione è simile al seguente:

COPY <source> <destination>

Se l'origine o la destinazione include spazio vuoto, racchiudere il percorso tra parentesi quadre e virgolette doppie, come illustrato nell'esempio seguente:

COPY ["<source>", "<destination>"]

Considerazioni sull'uso di COPY con Windows

In Windows, il formato di destinazione deve utilizzare le barre. Ad esempio, queste sono istruzioni valide COPY :

COPY test1.txt /temp/
COPY test1.txt c:/temp/

Nel frattempo, il formato seguente con barre rovesciata non funzionerà:

COPY test1.txt c:\temp\

Esempi di uso di COPY con Windows

Nell'esempio seguente viene aggiunto il contenuto della directory di origine a una directory denominata sqllite nell'immagine del contenitore:

COPY source /sqlite/

Nell'esempio seguente verranno aggiunti tutti i file che iniziano con la configurazione nella c:\temp directory dell'immagine del contenitore:

COPY config* c:/temp/

Per informazioni più dettagliate sull'istruzione COPY , vedere il riferimento ALLA COPIA.

ADD

L'istruzione ADD è simile all'istruzione COPY, ma con anche altre funzionalità. Oltre a copiare i file dall'host nell'immagine contenitore, l'istruzione ADD può anche copiare i file da una postazione remota con la specifica di un URL.

Il ADD formato dell'istruzione è simile al seguente:

ADD <source> <destination>

Se l'origine o la destinazione includono spazio vuoto, racchiudere il percorso tra parentesi quadre e virgolette doppie:

ADD ["<source>", "<destination>"]

Considerazioni sull'esecuzione di ADD con Windows

In Windows, il formato di destinazione deve utilizzare le barre. Ad esempio, queste sono istruzioni valide ADD :

ADD test1.txt /temp/
ADD test1.txt c:/temp/

Nel frattempo, il formato seguente con barre rovesciata non funzionerà:

ADD test1.txt c:\temp\

Inoltre, in Linux l'istruzione ADD espanderà i pacchetti compressi nella copia. Questa funzionalità non è disponibile in Windows.

Esempi di uso di ADD con Windows

Nell'esempio seguente viene aggiunto il contenuto della directory di origine a una directory denominata sqllite nell'immagine del contenitore:

ADD source /sqlite/

Nell'esempio seguente verranno aggiunti tutti i file che iniziano con "config" alla c:\temp directory dell'immagine del contenitore.

ADD config* c:/temp/

Nell'esempio seguente verrà scaricato Python per Windows nella c:\temp directory dell'immagine del contenitore.

ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe

Per informazioni più dettagliate sull'istruzione ADD , vedere il riferimento ADD.

WORKDIR

L'istruzione WORKDIR imposta una directory di lavoro per le altre istruzioni Dockerfile, ad esempio RUN, CMD e imposta la directory di lavoro per l'esecuzione di istanze dell'immagine contenitore.

Il WORKDIR formato dell'istruzione è simile al seguente:

WORKDIR <path to working directory>

Considerazioni sull'uso di WORKDIR con Windows

In Windows, se la directory di lavoro include una barra rovesciata, è necessario usare un carattere di escape.

WORKDIR c:\\windows

esempi

WORKDIR c:\\Apache24\\bin

Per informazioni dettagliate sull'istruzione WORKDIR , vedere il riferimento a WORKDIR.

CMD

L'istruzione CMD imposta il comando predefinito da eseguire quando si distribuisce un'istanza dell'immagine contenitore. Ad esempio, se il contenitore ospiterà un server Web NGINX, le CMD istruzioni potrebbero includere per avviare il server Web con un comando come nginx.exe. Se in un Dockerfile vengono specificate più istruzioni CMD, viene valutata solo l'ultima.

Il CMD formato dell'istruzione è simile al seguente:

# exec form

CMD ["<executable", "<param>"]

# shell form

CMD <command>

Considerazioni sull'uso di CMD con Windows

In Windows, i percorsi di file specificati nell'istruzione CMD devono usare le barre o le barre rovesciate con carattere di escape \\. Di seguito sono riportate istruzioni valide CMD :

# exec form

CMD ["c:\\Apache24\\bin\\httpd.exe", "-w"]

# shell form

CMD c:\\Apache24\\bin\\httpd.exe -w

Tuttavia, il formato seguente senza le barre appropriate non funzionerà:

CMD c:\Apache24\bin\httpd.exe -w

Per informazioni più dettagliate sull'istruzione CMD , vedere il riferimento a CMD.

Carattere di escape

In molti casi, un'istruzione Dockerfile dovrà estendersi su più righe. A tale scopo, è possibile usare un carattere di escape. Il carattere di escape Dockerfile predefinito è una barra rovesciata, \. Tuttavia, poiché la barra rovesciata è anche un separatore di percorso file in Windows, l'uso per estenderlo su più righe può causare problemi. Per risolvere questo problema, è possibile usare una direttiva parser per modificare il carattere di escape predefinito. Per altre informazioni sulle direttive del parser, vedere Direttive del parser.

Nell'esempio seguente viene illustrata una singola istruzione RUN che si estende su più righe usando il carattere di escape predefinito:

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command \
    $ErrorActionPreference = 'Stop'; \
    wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; \
    Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \
    Remove-Item c:\python-3.5.1.exe -Force

Per modificare il carattere di escape, inserire una direttiva parser di escape nella prima riga del Dockerfile. Questo può essere visto nell'esempio seguente.

Nota

È possibile usare solo due valori come caratteri di escape: \ e `.

# escape=`

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command `
    $ErrorActionPreference = 'Stop'; `
    wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; `
    Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; `
    Remove-Item c:\python-3.5.1.exe -Force

Per altre informazioni sulla direttiva del parser di escape, vedere Direttiva del parser di escape.

PowerShell in Dockerfile

Cmdlet PowerShell

I cmdlet di PowerShell possono essere eseguiti in un Dockerfile con l'operazione RUN .

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath c:\

Chiamate REST

Il cmdlet di Invoke-WebRequest PowerShell può essere utile quando si raccolgono informazioni o file da un servizio Web. Ad esempio, se si compila un'immagine che include Python, è possibile impostare $ProgressPreference per SilentlyContinue ottenere download più veloci, come illustrato nell'esempio seguente.

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command \
  $ErrorActionPreference = 'Stop'; \
  $ProgressPreference = 'SilentlyContinue'; \
  Invoke-WebRequest https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; \
  Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \
  Remove-Item c:\python-3.5.1.exe -Force

Nota

Invoke-WebRequest funziona anche in Nano Server.

È possibile usare PowerShell per scaricare i file durante il processo di creazione dell'immagine anche usando la libreria .NET WebClient. Questa opzione può migliorare le prestazioni del download. L'esempio seguente scarica il software di Python usando la libreria.

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command \
  $ErrorActionPreference = 'Stop'; \
  (New-Object System.Net.WebClient).DownloadFile('https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe','c:\python-3.5.1.exe') ; \
  Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \
  Remove-Item c:\python-3.5.1.exe -Force

Nota

Nano Server attualmente non supporta WebClient.

Script PowerShell

In alcuni casi, può essere utile copiare uno script nei contenitori usati durante il processo di creazione dell'immagine, quindi eseguire lo script dall'interno del contenitore.

Nota

Questo limiterà la memorizzazione nella cache dei livelli di immagine e ridurrà la leggibilità del Dockerfile.

Questo esempio copia uno script dal computer di compilazione nel contenitore usando l'istruzione ADD. Questo script viene quindi eseguito tramite l'istruzione RUN.

FROM mcr.microsoft.com/windows/servercore:ltsc2019
ADD script.ps1 /windows/temp/script.ps1
RUN powershell.exe -executionpolicy bypass c:\windows\temp\script.ps1

Compilazione Docker

Dopo aver creato e salvato un Dockerfile su disco, è possibile eseguire docker build per creare la nuova immagine. Il comando docker build accetta diversi parametri facoltativi e un percorso di Dockerfile. Per la documentazione completa su Docker Build, incluso un elenco di tutte le opzioni di compilazione, vedere il riferimento alla compilazione.

Il formato del comando è simile al docker build seguente:

docker build [OPTIONS] PATH

Ad esempio, il comando seguente creerà un'immagine denominata "iis".

docker build -t iis .

Quando il processo di compilazione è stato avviato, l'output indicherà lo stato e restituirà eventuali errori generati.

C:\> docker build -t iis .

Sending build context to Docker daemon 2.048 kB
Step 1 : FROM mcr.microsoft.com/windows/servercore:ltsc2019
 ---> 6801d964fda5

Step 2 : RUN dism /online /enable-feature /all /featurename:iis-webserver /NoRestart
 ---> Running in ae8759fb47db

Deployment Image Servicing and Management tool
Version: 10.0.10586.0

Image Version: 10.0.10586.0

Enabling feature(s)
The operation completed successfully.

 ---> 4cd675d35444
Removing intermediate container ae8759fb47db

Step 3 : RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html
 ---> Running in 9a26b8bcaa3a
 ---> e2aafdfbe392
Removing intermediate container 9a26b8bcaa3a

Successfully built e2aafdfbe392

Il risultato è una nuova immagine del contenitore, che in questo esempio è denominata "iis".

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
iis                 latest              e2aafdfbe392        About a minute ago   207.8 MB
windowsservercore   latest              6801d964fda5        4 months ago         0 B

Ulteriori informazioni di lettura e riferimenti