Fichier Dockerfile sur Windows

Le moteur Docker comprend des outils qui automatisent la création d'images de conteneur. Rien ne vous empêche de créer des images de conteneur manuellement en exécutant la commande docker commit, mais l'adoption d'un processus de création d'image automatisé présente de nombreux avantages, parmi lesquels :

  • stockage d’images de conteneur sous forme de code ;
  • nouvelle création rapide et précise d’images de conteneur à des fins de maintenance et de mise à niveau ;
  • intégration continue entre les images de conteneur et le cycle de développement.

Les composants Docker qui dirigent cette automatisation sont le fichier Dockerfile et la commande docker build.

Le fichier Dockerfile est un fichier texte qui contient les instructions nécessaires à la création d'une image de conteneur. Ces instructions incluent l’identification d’une image existante à utiliser comme base, les commandes à exécuter pendant le processus de création d’image et une commande qui s’exécute quand de nouvelles instances de l’image de conteneur sont déployées.

Docker build est la commande du moteur Docker qui utilise un fichier Dockerfile et déclenche le processus de création d'image.

Cette rubrique vous explique comment utiliser des fichiers Dockerfile avec des conteneurs Windows, vous aide à comprendre leur syntaxe de base et vous présente les instructions les plus courantes des fichiers Dockerfile.

Ce document aborde le concept d'images de conteneur et de couches d'images de conteneur. Si vous souhaitez en savoir plus sur les images et la superposition d'images, consultez Images de base de conteneur.

Pour une présentation complète des fichiers Dockerfile, consultez les Informations de référence sur les fichiers Dockerfile.

Syntaxe de base

Sous sa forme la plus basique, un fichier Dockerfile peut être très simple. L’exemple suivant crée une image, qui comprend IIS et un site « hello world ». Cet exemple inclut des commentaires (signalés par un #), qui décrivent chaque étape. Les sections suivantes de cet article approfondissent les règles de syntaxe et les instructions pour les fichiers Dockerfile.

Notes

Le fichier Dockerfile créé ne doit pas comporter d'extension. Pour ce faire dans Windows, créez le fichier à l'aide de l'éditeur de votre choix, puis enregistrez-le en utilisant la notation "Dockerfile" (guillemets compris).

# 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" ]

Pour accéder à d'autres exemples de fichiers Dockerfile pour Windows, consultez le Référentiel de fichiers Dockerfile pour Windows.

Instructions

Les instructions relatives aux fichiers Dockerfile fournissent au moteur Docker les instructions nécessaires à la création d'une image de conteneur. Ces instructions sont exécutées une par une et dans l'ordre. Les exemples suivants correspondent aux instructions les plus couramment utilisées dans les fichiers Dockerfile. Pour obtenir la liste complète des instructions relatives aux fichiers Dockerfile, consultez les Informations de référence sur les fichiers Dockerfile.

FROM

L’instruction FROM définit l’image de conteneur qui sera utilisée pendant le processus de création de l’image. Par exemple, quand vous utilisez l’instruction FROM mcr.microsoft.com/windows/servercore, l’image obtenue est dérivée de l’image du système d’exploitation de base Windows Server Core et a une dépendance sur celle-ci. Si l’image spécifiée n’est pas présente sur le système où le processus de génération Docker est en cours d’exécution, le moteur Docker tente de télécharger l’image à partir d’un Registre d’images public ou privé.

Le format de l'instruction FROM se présente comme suit :

FROM <image>

Voici un exemple de commande FROM :

Pour télécharger la version ltsc2019 de Windows Server Core à partir de Microsoft Container Registry (MCR) :

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

Pour plus d'informations, consultez les Informations de référence sur FROM.

EXÉCUTER

L’instruction RUN spécifie les commandes à exécuter et capturer dans la nouvelle image de conteneur. Ces commandes peuvent concerner notamment l’installation de logiciels ou encore la création de fichiers et de répertoires ainsi que de la configuration de l’environnement.

L'instruction RUN se présente comme suit :

# exec form

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

# shell form

RUN <command>

La différence entre la forme exec et la forme shell réside dans la façon dont l'instruction RUN est exécutée. Quand vous utilisez la forme exec, le programme spécifié est exécuté explicitement.

Voici un exemple de forme exec :

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

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

L'image qui en résulte exécute la commande powershell New-Item c:/test :

docker history doc-exe-method

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

En revanche, l'exemple suivant exécute cette même opération sous la forme shell :

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

RUN powershell New-Item c:\test

L'instruction d'exécution de l'image qui en résulte est la suivante : 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

Éléments à prendre en considération pour utiliser RUN avec Windows

Sur Windows, quand vous utilisez l’instruction RUN avec le format exec, les barres obliques inverses doivent être placées dans une séquence d’échappement.

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

Lorsque le programme cible est un programme d'installation Windows, vous devez l'extraire à l'aide de l'indicateur /x:<directory> avant de pouvoir lancer la procédure d'installation (silencieuse) proprement dite. Vous devez également attendre la fin de l'exécution de la commande avant de faire quoi que ce soit d'autre. Sinon le processus se termine prématurément sans avoir installé quoi que ce soit. Pour plus d’informations, consultez l’exemple ci-dessous.

Exemples d'utilisation de RUN avec Windows

L'exemple de fichier Dockerfile suivant utilise DISM pour installer IIS dans l'image du conteneur :

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

Cet exemple installe le package redistribuable Visual Studio. Start-Process et le paramètre -Wait sont utilisés pour exécuter le programme d'installation. Cela permet de s'assurer que l'installation est terminée avant de passer à l'instruction suivante dans le fichier Dockerfile.

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

Pour plus d'informations sur l'instruction RUN, consultez les Informations de référence sur RUN.

COPY

L'instruction COPY copie les fichiers et les répertoires dans le système de fichiers du conteneur. Les fichiers et répertoires doivent se trouver dans un chemin relatif au fichier Dockerfile.

Le format de l'instruction COPY se présente comme suit :

COPY <source> <destination>

Si la source ou la destination comprend des espaces blancs, placez le chemin entre crochets et guillemets doubles, comme indiqué dans l'exemple suivant :

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

Éléments à prendre en considération pour utiliser COPY avec Windows

Sur Windows, le format de destination doit utiliser des barres obliques. Voici, par exemple, des instructions COPY valides :

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

Le format suivant, avec barres obliques inverses, ne fonctionnera pas :

COPY test1.txt c:\temp\

Exemples d'utilisation de COPY avec Windows

L'exemple suivant ajoute le contenu du répertoire source à un répertoire nommé sqllite dans l'image de conteneur.

COPY source /sqlite/

L'exemple suivant ajoute tous les fichiers qui commencent par config au répertoire c:\temp de l'image de conteneur :

COPY config* c:/temp/

Pour plus d'informations sur l'instruction COPY, consultez les Informations de référence sur COPY.

ADD

L'instruction ADD est semblable à l'instruction COPY, mais avec encore plus de possibilités. En plus de copier des fichiers à partir de l’hôte dans l’image de conteneur, l’instruction ADD peut également copier des fichiers depuis un emplacement distant avec une spécification d’URL.

Le format de l'instruction ADD se présente comme suit :

ADD <source> <destination>

Si la source ou la destination contient des espaces blancs, placez le chemin entre crochets et guillemets doubles :

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

Éléments à prendre en considération pour utiliser ADD avec Windows

Sur Windows, le format de destination doit utiliser des barres obliques. Voici, par exemple, des instructions ADD valides :

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

Le format suivant, avec barres obliques inverses, ne fonctionnera pas :

ADD test1.txt c:\temp\

En outre, sur Linux, l’instruction ADD développera des packages compressés dans le cadre d’une copie. Cette fonctionnalité n’est pas disponible dans Windows.

Exemples d'utilisation de ADD avec Windows

L'exemple suivant ajoute le contenu du répertoire source à un répertoire nommé sqllite dans l'image de conteneur.

ADD source /sqlite/

L'exemple suivant ajoute tous les fichiers qui commencent par « config » au répertoire c:\temp de l'image de conteneur.

ADD config* c:/temp/

L'exemple suivant télécharge Python pour Windows dans le répertoire c:\temp de l'image de conteneur.

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

Pour plus d'informations sur l'instruction ADD, consultez les Informations de référence sur ADD.

WORKDIR

L’instruction WORKDIR définit un répertoire de travail pour d’autres instructions pour les fichiers Dockerfile, telles que RUN et CMD, ainsi que le répertoire de travail pour les instances en cours d’exécution de l’image de conteneur.

Le format de l'instruction WORKDIR se présente comme suit :

WORKDIR <path to working directory>

Éléments à prendre en considération pour utiliser WORKDIR avec Windows

Sur Windows, si le répertoire de travail comprend une barre oblique inverse, celle-ci doit être placée dans une séquence d’échappement.

WORKDIR c:\\windows

Exemples

WORKDIR c:\\Apache24\\bin

Pour plus d'informations sur l'instruction WORKDIR, consultez les Informations de référence sur WORKDIR.

CMD

L’instruction CMD définit la commande par défaut à exécuter lors du déploiement d’une instance de l’image de conteneur. Par exemple, si le conteneur doit héberger un serveur web NGINX, l'instruction CMD peut inclure des instructions de démarrage du serveur web avec une commande comme nginx.exe. Si plusieurs instructions CMD sont spécifiées dans un fichier Dockerfile, seule la dernière est évaluée.

Le format de l'instruction CMD se présente comme suit :

# exec form

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

# shell form

CMD <command>

Éléments à prendre en considération pour utiliser CMD avec Windows

Sur Windows, les chemins de fichiers spécifiés dans l’instruction CMD doivent utiliser des barres obliques. En outre, les barres obliques inverses \\ doivent être placées dans une séquence d’échappement. Les instructions CMD valides sont les suivantes :

# exec form

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

# shell form

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

En revanche, le format suivant, sans les barres obliques appropriées, ne fonctionnera pas :

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

Pour plus d'informations sur l'instruction CMD, consultez les Informations de référence sur CMD.

Caractère d’échappement

Souvent, une instruction de fichier Dockerfile doit occuper plusieurs lignes. Pour cela, vous pouvez utiliser un caractère d'échappement. Le caractère d’échappement de fichier Dockerfile par défaut est une barre oblique inverse \. Cependant, comme la barre oblique inverse est également un séparateur de chemin de fichier dans Windows, son utilisation pour occuper plusieurs lignes peut entraîner des problèmes. Pour y remédier, vous pouvez utiliser une directive d'analyseur afin de modifier le caractère d'échappement par défaut. Pour plus d'informations sur les directives d'analyseur, consultez Directives d'analyseur.

L'exemple suivant présente une instruction RUN unique qui occupe plusieurs lignes grâce au caractère d'échappement par défaut.

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

Pour modifier le caractère d’échappement, placez une directive d’analyseur d’échappement sur la toute première ligne du fichier Dockerfile. Une illustration figure dans l'exemple suivant.

Notes

Seules deux valeurs peuvent être utilisées en tant que caractères d'échappement : \ et `.

# 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

Pour plus d'informations sur la directive d'analyseur d'échappement, consultez Directive d'analyseur d'échappement.

PowerShell dans un fichier Dockerfile

Applets de commande PowerShell

Les cmdlets PowerShell peuvent être exécutées dans un fichier Dockerfile avec l'opération RUN.

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

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

Appels REST

La cmdlet Invoke-WebRequest de PowerShell peut s'avérer utile lors de la collecte d'informations ou de fichiers à partir d'un service web. Par exemple, si vous créez une image qui inclut Python, vous pouvez définir $ProgressPreference sur SilentlyContinue pour bénéficier de téléchargements plus rapides, comme illustré dans l'exemple suivant.

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

Notes

Invoke-WebRequest fonctionne également dans Nano Server.

Pour télécharger les fichiers avec PowerShell pendant le processus de création d’image, une autre option consiste à employer la bibliothèque WebClient .NET. Cela peut améliorer les performances en matière de téléchargement. L’exemple suivant télécharge le logiciel Python à l’aide de la bibliothèque WebClient.

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

Notes

Nano Server ne prend actuellement pas en charge WebClient.

Scripts PowerShell

Dans certains cas, il peut être utile de copier un script dans les conteneurs que vous utilisez au cours du processus de création d'image, puis d'exécuter le script à partir du conteneur.

Notes

Vous limitez ainsi la mise en cache des couches d'images et réduisez la lisibilité du fichier Dockerfile.

Cet exemple copie un script à partir de l’ordinateur de build dans le conteneur à l’aide de l’instruction ADD. Ce script est alors exécuté à l’aide de l’instruction 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

Docker build

Une fois qu'un fichier Dockerfile a été créé et enregistré sur disque, vous pouvez exécuter la commande docker build pour créer l'image. La commande docker build accepte plusieurs paramètres facultatifs et un chemin d’accès au fichier Dockerfile. Pour obtenir une documentation complète sur Docker build, avec notamment la liste de toutes les options de build, consultez les Informations de référence sur build.

Le format de la commande docker build se présente comme suit :

docker build [OPTIONS] PATH

Par exemple, la commande suivante crée une image nommée « iis ».

docker build -t iis .

Une fois le processus build lancé, la sortie indique l'état et renvoie les erreurs éventuelles.

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

Le résultat obtenu est une nouvelle image de conteneur, nommée « iis » dans cet exemple.

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

Informations et références supplémentaires