Dockerfile unter Windows
Die Docker-Engine umfasst Tools, die das Erstellen von Containerimages automatisieren. Containerimages können zwar manuell mit dem Befehl docker commit
erstellt werden, doch die Verwendung eines automatisierten Imageerstellungsprozesses bietet viele Vorteile, unter anderem:
- Speichern von Containerimages als Code.
- Schnelle und präzise Neuerstellung von Containerimages für Wartung und Aktualisierung.
- Fortlaufende Integration von Containerimages in den Entwicklungszyklus.
Die Docker-Komponenten, die diese Automatisierung steuern, sind die Dockerfile-Datei und der docker build
-Befehl.
Die Dockerfile-Datei ist eine Textdatei mit Anweisungen, die erforderlich sind, um ein neues Containerimage zu erstellen. Diese Anweisungen beinhalten die Identifikation eines vorhandenen Images, das als Basis verwendet werden kann, Befehle, die während des Erstellungsprozesses ausgeführt werden, und einen Befehl, der bei der Bereitstellung neuer Instanzen des Containerimages ausgeführt wird.
„Docker Build“ ist der Befehl der Docker-Engine, der eine Dockerfile-Datei nutzt und den Imageerstellungsprozess auslöst.
In diesem Thema erfahren Sie, wie Sie Dockerfile-Dateien mit Windows-Containern verwenden, die grundlegende Syntax verstehen und die gängigsten Dockerfile-Anweisungen verwenden.
In diesem Dokument wird das Konzept von Containerimages und Containerimageebenen erörtert. Weitere Informationen zu Images und Imageebenen finden Sie unter Containerbasisimages.
Umfassende Informationen zu Dockerfile-Dateien finden Sie in der Dockerfile-Referenz.
Grundlegende Syntax
In ihrer grundlegendsten Form kann eine Dockerfile-Datei sehr einfach sein. Das folgende Beispiel erstellt ein neues Image, das IIS und eine „Hello World“-Website beinhaltet. Dieses Beispiel enthält Kommentare (mit #
gekennzeichnet), die jeden Schritt erläutern. Nachfolgende Abschnitte dieses Artikels gehen ausführlicher auf Dockerfile-Syntaxregeln und -Anweisungen ein.
Hinweis
Eine Dockerfile-Datei muss ohne Erweiterung erstellt werden. In Windows erstellen Sie die Datei mit einem Editor Ihrer Wahl und speichern sie dann als "Dockerfile" (einschließlich der Anführungszeichen).
# 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" ]
Weitere Beispiele für Dockerfile-Dateien für Windows finden Sie im Repository „Dockerfile for Windows“.
Instructions
Dockerfile-Anweisungen informieren die Docker-Engine über die erforderlichen Schritte zum Erstellen eines Containerimages. Diese Anweisungen werden einzeln der Reihe nach ausgeführt. In den folgenden Beispielen finden Sie die am häufigsten verwendeten Anweisungen in Dockerfile-Dateien. Eine umfassende Liste der Dockerfile-Anweisungen finden Sie in der Dockerfile-Referenz.
FROM
Die FROM
-Anweisung legt das Containerimage fest, das während der Erstellung des neuen Images verwendet wird. Beispielsweise wird bei Verwendung von Anweisung FROM mcr.microsoft.com/windows/servercore
das resultierende Image vom Windows Server Core-Basisbetriebssystemimage abgeleitet und ist davon abhängig. Ist das angegebene Image nicht auf dem System vorhanden, auf dem der „Docker Build“-Prozess ausgeführt wird, versucht die Docker-Engine, das Image von einer öffentlichen oder privaten Imageregistrierung herunterzuladen.
Das Format der FROM-Anweisung sieht wie folgt aus:
FROM <image>
Hier sehen Sie ein Beispiel für den FROM-Befehl:
Laden Sie die Version ltsc2019 von Windows Server Core aus Microsoft Container Registry (MCR) herunter:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
Weitere Informationen finden Sie in der FROM-Referenz.
AUSFÜHREN
Die RUN
-Anweisung gibt Befehle an, die ausgeführt und im neuen Containerimage erfasst werden sollen. Diese Befehle können Elemente wie das Installieren von Software sowie das Erstellen von Dateien, Verzeichnissen und Umgebungskonfigurationen enthalten.
Die RUN-Anweisung sieht wie folgt aus:
# exec form
RUN ["<executable>", "<param 1>", "<param 2>"]
# shell form
RUN <command>
Das Exec- und Shell-Format unterscheiden sich darin, wie die RUN
-Anweisung ausgeführt wird. Bei Verwendung des Exec-Formats wird das angegebene Programm explizit ausgeführt.
Das folgende Beispiel zeigt das Exec-Format:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN ["powershell", "New-Item", "c:/test"]
Das sich ergebende Image führt den Befehl powershell New-Item c:/test
aus:
docker history doc-exe-method
IMAGE CREATED CREATED BY SIZE COMMENT
b3452b13e472 2 minutes ago powershell New-Item c:/test 30.76 MB
Im Gegensatz dazu wird im folgenden Beispiel der gleiche Vorgang im Shell-Format ausgeführt:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell New-Item c:\test
Das sich ergebende Image weist eine Ausführungsanweisung cmd /S /C powershell New-Item c:\test
auf.
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
Überlegungen zur Verwendung von RUN mit Windows
Wenn unter Windows die RUN
-Anweisung mit dem Exec-Format verwendet wird, müssen umgekehrte Schrägstriche mit Escapezeichen versehen werden.
RUN ["powershell", "New-Item", "c:\\test"]
Wenn das Zielprogramm ein Windows-Installer ist, müssen Sie das Setup über das /x:<directory>
-Flag extrahieren, bevor Sie das eigentliche (unbeaufsichtigte) Installationsverfahren starten können. Sie müssen außerdem warten, bis der Befehl beendet wird, bevor Sie eine andere Aktion ausführen. Andernfalls endet der Vorgang vorzeitig, ohne dass etwas installiert wurde. Weitere Informationen finden Sie im folgenden Beispiel.
Beispiele für die Verwendung von RUN mit Windows
Die folgende Dockerfile-Beispieldatei verwendet DISM zum Installieren von IIS im Containerimage:
RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart
In diesem Beispiel wird das verteilbare Paket von Visual Studio installiert.
Start-Process
und der Parameter -Wait
werden verwendet, um das Installationsprogramm auszuführen. Dadurch wird gewährleistet, dass die Installation abgeschlossen wird, bevor in der Dockerfile-Datei mit der nächsten Anweisung begonnen wird.
RUN powershell.exe -Command Start-Process c:\vcredist_x86.exe -ArgumentList '/quiet' -Wait
Ausführliche Informationen zur RUN-Anweisung finden Sie in der RUN-Referenz.
COPY
Die COPY
-Anweisung kopiert Dateien und Verzeichnisse in das Dateisystem des Containers. Die Dateien und Verzeichnisse müssen sich in einem zur Dockerfile-Datei relativen Pfad befinden.
Das Format der COPY
-Anweisung sieht wie folgt aus:
COPY <source> <destination>
Wenn die Quelle oder das Ziel Leerzeichen enthalten, schließen Sie den Pfad in eckige Klammern und doppelte Anführungszeichen ein. Das folgende Beispiel zeigt dies:
COPY ["<source>", "<destination>"]
Überlegungen zur Verwendung von COPY mit Windows
Unter Windows müssen im Zielformat Schrägstriche verwendet werden. Dies sind z. B. gültige COPY
-Anweisungen:
COPY test1.txt /temp/
COPY test1.txt c:/temp/
Folgende Formate mit umgekehrten Schrägstrichen funktionieren jedoch nicht:
COPY test1.txt c:\temp\
Beispiele für die Verwendung von COPY mit Windows
Im folgenden Beispiel wird der Inhalt des Quellverzeichnisses in ein Verzeichnis namens sqllite
kopiert, das sich im Containerimage befindet:
COPY source /sqlite/
Im folgenden Beispiel werden alle Dateien, die mit „config“ beginnen, dem Verzeichnis c:\temp
des Containerimages hinzugefügt:
COPY config* c:/temp/
Ausführliche Informationen zur COPY
-Anweisung finden Sie in der COPY-Referenz.
ADD
Die ADD-Anweisung ähnelt der COPY-Anweisung, weist aber noch mehr Funktionen auf. Die ADD
-Anweisung kann nicht nur Dateien vom Host in das Containerimage kopieren, sondern auch von einem Remotestandort aus mit einer URL-Spezifikation.
Das Format der ADD
-Anweisung sieht wie folgt aus:
ADD <source> <destination>
Wenn die Quelle oder das Ziel Leerzeichen enthalten, schließen Sie den Pfad in eckige Klammern und doppelte Anführungszeichen ein:
ADD ["<source>", "<destination>"]
Überlegungen zur Ausführung von ADD mit Windows
Unter Windows müssen im Zielformat Schrägstriche verwendet werden. Dies sind z. B. gültige ADD
-Anweisungen:
ADD test1.txt /temp/
ADD test1.txt c:/temp/
Folgende Formate mit umgekehrten Schrägstrichen funktionieren jedoch nicht:
ADD test1.txt c:\temp\
Außerdem erweitert die ADD
-Anweisung unter Linux komprimierte Pakete beim Kopieren. Diese Funktionalität ist in Windows nicht verfügbar.
Beispiele für die Verwendung von ADD mit Windows
Im folgenden Beispiel wird der Inhalt des Quellverzeichnisses in ein Verzeichnis namens sqllite
kopiert, das sich im Containerimage befindet:
ADD source /sqlite/
Im folgenden Beispiel werden alle Dateien, die mit „config“ beginnen, dem Verzeichnis c:\temp
des Containerimages hinzugefügt.
ADD config* c:/temp/
In diesem Beispiel wird Python für Windows in das Verzeichnis c:\temp
des Containerimages heruntergeladen.
ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe
Ausführlichere Informationen zur ADD
-Anweisung finden Sie in der ADD-Referenz.
WORKDIR
Die WORKDIR
-Anweisung legt ein Arbeitsverzeichnis für andere Dockerfile-Anweisungen wie z.B. RUN
und CMD
sowie das Arbeitsverzeichnis für ausgeführte Instanzen des Containerimages fest.
Das Format der WORKDIR
-Anweisung sieht wie folgt aus:
WORKDIR <path to working directory>
Überlegungen zur Verwendung von WORKDIR mit Windows
Wenn das Arbeitsverzeichnis unter Windows einen umgekehrten Schrägstrich enthält, muss es mit Escapezeichen versehen werden.
WORKDIR c:\\windows
Beispiele
WORKDIR c:\\Apache24\\bin
Ausführliche Informationen zur WORKDIR
-Anweisung finden Sie in der WORKDIR-Referenz.
Befehlszeile
Die CMD
-Anweisung legt den Standardbefehl fest, der bei der Bereitstellung einer Instanz des Containerimages ausgeführt werden soll. Wenn der Container beispielsweise einen NGINX-Webserver hostet, könnte CMD
Anweisungen zum Starten des Webservers mit einem Befehl wie nginx.exe
enthalten. Wenn mehrere CMD
-Anweisungen in einer Dockerfile-Datei angegeben sind, wird nur die letzte ausgewertet.
Das Format der CMD
-Anweisung sieht wie folgt aus:
# exec form
CMD ["<executable", "<param>"]
# shell form
CMD <command>
Überlegungen zur Verwendung von CMD mit Windows
Unter Windows müssen in Dateipfaden, die in der CMD
-Anweisung angegeben werden, Schrägstriche oder mit Escapezeichen versehene umgekehrte Schrägstriche \\
verwendet werden. Die folgenden Anweisungen sind gültige CMD
-Anweisungen:
# exec form
CMD ["c:\\Apache24\\bin\\httpd.exe", "-w"]
# shell form
CMD c:\\Apache24\\bin\\httpd.exe -w
Das folgende Format ohne die entsprechenden Schrägstriche funktioniert jedoch nicht:
CMD c:\Apache24\bin\httpd.exe -w
Ausführlichere Informationen zur CMD
-Anweisung finden Sie in der CMD-Referenz.
Escapezeichen
Eine Dockerfile-Anweisung muss häufig mehrere Zeilen umfassen. Zu diesem Zweck können Sie ein Escapezeichen verwenden. In einer Dockerfile-Anweisung wird als Escapezeichen standardmäßig ein umgekehrter Schrägstrich verwendet: \
. Da der umgekehrte Schrägstrich jedoch auch ein Trennzeichen für Dateipfade in Windows ist, kann seine Verwendung zur Angabe von mehreren Zeilen zu Problemen führen. Als Problemumgehung können Sie eine Parserdirektive zum Ändern des Standardescapezeichens verwenden. Weitere Informationen zu Parserdirektiven finden Sie unter Parserdirektiven.
Das folgende Beispiel zeigt eine einzelne RUN-Anweisung, die mehrere Zeilen umfasst und für die das Standardescapezeichen verwendet wird:
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
Platzieren Sie zum Ändern des Escapezeichens eine Escape-Parser-Anweisung in der ersten Zeile der Dockerfile-Datei. Dies wird im folgenden Beispiel veranschaulicht.
Hinweis
Nur zwei Werte können als Escapezeichen verwendet werden: \
und `
.
# 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
Weitere Informationen zur Escape-Parserdirektive finden Sie unter Escape-Parserdirektive.
PowerShell in Dockerfile
PowerShell-Cmdlets
PowerShell-Cmdlets können mit dem RUN
-Vorgang in einer Dockerfile-Datei ausgeführt werden.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath c:\
REST-Aufrufe
Das PowerShell-Cmdlet Invoke-WebRequest
kann beim Erfassen von Informationen oder Dateien von einem Webdienst hilfreich sein. Wenn Sie z. B. ein Image erstellen, das Python enthält, können Sie $ProgressPreference
auf SilentlyContinue
festlegen, um schnellere Downloads zu erreichen, wie im folgenden Beispiel gezeigt wird.
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
Hinweis
Invoke-WebRequest
funktioniert auch in Nano Server.
Eine weitere Möglichkeit zur Verwendung von PowerShell zum Herunterladen von Dateien während des Prozesses der Imageerstellung ist die Verwendung der .NET WebClient-Bibliothek. Dies kann die Downloadleistung verbessern. Im folgenden Beispiel wird die Python-Software mit der WebClient-Bibliothek heruntergeladen.
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
Hinweis
Nano Server unterstützt WebClient zurzeit nicht.
PowerShell-Skripts
In einigen Fällen kann es hilfreich sein, ein Skript in die Container zu kopieren, die Sie während des Vorgangs der Imageerstellung verwende, und das Skript dann aus dem Container heraus auszuführen.
Hinweis
Hierdurch wird das Zwischenspeichern von Imageebenen eingeschränkt und die Lesbarkeit der Dockerfile-Datei verringert.
In diesem Beispiel wird ein Skript vom Buildcomputer mithilfe der ADD
-Anweisung in den Container kopiert. Dieses Skript wird dann mit der RUN-Anweisung ausgeführt.
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
Sobald Sie eine Dockerfile-Datei erstellt und auf der Festplatte gespeichert haben, können Sie docker build
ausführen, um das neue Image zu erstellen. Der docker build
-Befehl unterstützt verschiedene optionale Parameter und einen Pfad zur Dockerfile-Datei. Eine vollständige Dokumentation zu Docker Build einschließlich einer Liste aller Buildoptionen finden Sie in der Build-Referenz.
Das Format des Befehls docker build
sieht wie folgt aus:
docker build [OPTIONS] PATH
Der folgende Befehl erstellt z. B. ein Image mit dem Namen „iis“.
docker build -t iis .
Wenn der Buildprozess eingeleitet wurde, wird der Status ausgegeben, und ggf. werden Fehlermeldungen zurückgegeben.
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
Das Ergebnis ist ein neues Containerimage, das in diesem Beispiel den Namen „iis“ trägt.
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