Dockerfile unter Windows
Das Docker-Modul enthält Tools, die die Erstellung von Containerimages automatisieren. Während Sie Containerimages manuell erstellen können, indem Sie den Befehl docker commit
ausführen, hat die Übernahme eines automatisierten Imageerstellungsprozesses viele Vorteile, darunter:
- Speichern von Containerimages als Code.
- Schnelle und präzise Wiederherstellung von Containerimages für Wartungs- und Upgradezwecke.
- Continuous Integration zwischen Containerimages und Entwicklungszyklus.
Die Docker-Komponenten, die diese Automatisierung steuern, sind die Dockerfile- und der docker build
-Befehl.
Die Dockerfile-Datei ist eine Textdatei, die die Zum Erstellen eines neuen Containerimages erforderlichen Anweisungen enthält. Diese Anweisungen umfassen die Identifizierung eines vorhandenen Images, das als Basis verwendet werden soll, Befehle, die während des Imageerstellungsprozesses ausgeführt werden sollen, und einen Befehl, der ausgeführt wird, wenn neue Instanzen des Containerimages bereitgestellt werden.
Der Befehl „Docker build“ ist ein Kommando des Docker-Engines, das eine Dockerfile verarbeitet und den Bild-Erstellungsprozess auslöst.
In diesem Thema erfahren Sie, wie Sie Dockerfiles mit Windows-Containern verwenden, deren grundlegende Syntax verstehen und was die am häufigsten verwendeten Dockerfile-Anweisungen sind.
In diesem Dokument wird das Konzept von Containerimages und Containerimageebenen erläutert. Wenn Sie mehr über Images und Image-Layering erfahren möchten, lesen Sie nach unter Container-Basisimages.
Einen vollständigen Überblick über Dockerfiles finden Sie in der Dockerfile-Referenz .
Grundlegende Syntax
In seiner einfachsten Form kann eine Dockerfile sehr einfach sein. Im folgenden Beispiel wird ein neues Bild erstellt, das IIS und eine "Hello World"-Website enthält. Dieses Beispiel enthält Kommentare (angegeben mit einem #
), die jeden Schritt erläutern. In den nachfolgenden Abschnitten dieses Artikels finden Sie ausführlichere Informationen zu Dockerfile-Syntaxregeln und Dockerfile-Anweisungen.
Anmerkung
Eine Dockerfile-Datei muss ohne Erweiterung erstellt werden. Erstellen Sie dazu in Windows die Datei mit Dem Editor ihrer Wahl, und speichern Sie sie dann mit der Notation "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 Dockerfiles für Windows finden Sie im Dockerfile für Windows-Repository.
Anweisungen
Dockerfile-Anweisungen geben der Docker Engine die Anweisungen, die zum Erstellen eines Containerimages erforderlich sind. Diese Anweisungen werden einzeln und in der Reihenfolge ausgeführt. Die folgenden Beispiele sind die am häufigsten verwendeten Anweisungen in Dockerfiles. Eine vollständige Liste der Dockerfile-Anweisungen finden Sie in der Dockerfile-Referenz.
FROM
Die FROM
Anweisung legt das Containerimage fest, das während des neuen Imageerstellungsprozesses verwendet wird. Wenn Sie z. B. die Anweisung FROM mcr.microsoft.com/windows/servercore
verwenden, wird das resultierende Image von dem Windows Server Core-Basisbetriebssystemimage abgeleitet und hat eine Abhängigkeit. Wenn das angegebene Image nicht auf dem System vorhanden ist, in dem der Docker-Buildprozess ausgeführt wird, versucht das Docker-Modul, das Image aus einer öffentlichen oder privaten Imageregistrierung herunterzuladen.
Das FORMAT der FROM-Anweisung sieht wie folgt aus:
FROM <image>
Hier ist ein Beispiel für den FROM-Befehl:
So laden Sie den Windows Server Core der ltsc2019-Version aus der Microsoft Container Registry (MCR) herunter:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
Ausführlichere Informationen finden Sie in der FROM-Referenz.
LAUFEN
Die RUN
-Anweisung gibt Befehle an, die ausgeführt werden sollen, und im neuen Container-Image eingefangen werden. Diese Befehle können Elemente wie das Installieren von Software, das Erstellen von Dateien und Verzeichnissen und die Erstellung von Umgebungskonfigurationen umfassen.
Die RUN-Anweisung sieht wie folgt aus:
# exec form
RUN ["<executable>", "<param 1>", "<param 2>"]
# shell form
RUN <command>
Der Unterschied zwischen dem Exec- und shell-Formular besteht darin, wie die RUN
Anweisung ausgeführt wird. Wenn Sie das Exec-Formular verwenden, wird das angegebene Programm explizit ausgeführt.
Hier ist ein Beispiel für das Exec-Formular:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN ["powershell", "New-Item", "c:/test"]
Das resultierende Bild 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 derselbe Vorgang im Shell-Format ausgeführt.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell New-Item c:\test
Das sich ergebende Image weist die 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 Ausführungsformat verwendet wird, müssen umgekehrte Schrägstriche mit Escapezeichen versehen werden.
RUN ["powershell", "New-Item", "c:\\test"]
Wenn es sich bei dem Zielprogramm um ein Windows-Installationsprogramm handelt, müssen Sie das Setup über das Flag /x:<directory>
extrahieren, bevor Sie das eigentliche (automatische) Installationsverfahren starten können. Sie müssen auch warten, bis der Befehl beendet wird, bevor Sie etwas anderes ausführen. Andernfalls endet der Vorgang vorzeitig, ohne etwas zu installieren. Einzelheiten hierzu finden Sie im folgenden Beispiel.
Beispiele für die Verwendung von RUN mit Windows
Im folgenden Beispiel verwendet Dockerfile DISM zum Installieren von IIS im Containerimage:
RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart
In diesem Beispiel wird das verteilbare Visual Studio-Paket installiert. Start-Process
und der parameter -Wait
werden verwendet, um das Installationsprogramm auszuführen. Dadurch wird sichergestellt, dass die Installation abgeschlossen ist, bevor Sie mit der nächsten Anweisung in der Dockerfile-Datei fortfahren.
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 Pfad relativ zur Dockerfile-Datei befinden.
Das Format der COPY
Anweisung sieht wie folgt aus:
COPY <source> <destination>
Wenn eine Quelle oder ein Ziel Leerzeichen enthält, schließen Sie den Pfad in eckige Klammern und doppelte Anführungszeichen ein, wie im folgenden Beispiel gezeigt:
COPY ["<source>", "<destination>"]
Überlegungen zur Verwendung von COPY mit Windows
Unter Windows müssen im Zielformat Schrägstriche verwendet werden. Dies sind beispielsweise gültige COPY
Anweisungen:
COPY test1.txt /temp/
COPY test1.txt c:/temp/
Folgende Formate mit umgekehrten Schrägstrichen funktionieren dagegen nicht:
COPY test1.txt c:\temp\
Beispiele für die Verwendung von COPY mit Windows
Im folgenden Beispiel wird der Inhalt des Quellverzeichnisses zu einem Verzeichnis namens sqllite
im Containerimage hinzugefügt:
COPY source /sqlite/
Im folgenden Beispiel werden alle Dateien, die mit config beginnen, in das c:\temp
-Verzeichnis des Container-Images hinzugefügt:
COPY config* c:/temp/
Ausführlichere Informationen zur COPY
Anweisung finden Sie in der COPY-Referenz.
ADD
Die ADD-Anweisung ähnelt der COPY-Anweisung, aber mit noch mehr Funktionen. Neben dem Kopieren von Dateien vom Host in das Containerimage kann die ADD
Anweisung auch Dateien von einem Remotespeicherort mit einer URL-Spezifikation kopieren.
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 zum Ausführen von ADD mit Windows
Unter Windows müssen im Zielformat Schrägstriche verwendet werden. Dies sind beispielsweise gültige ADD
Anweisungen:
ADD test1.txt /temp/
ADD test1.txt c:/temp/
Folgende Formate mit umgekehrten Schrägstrichen funktionieren dagegen nicht:
ADD test1.txt c:\temp\
Darüber hinaus wird unter Linux die ADD
-Instruktion beim Kopieren komprimierte Pakete erweitern. 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 zu einem Verzeichnis namens sqllite
im Containerimage hinzugefügt:
ADD source /sqlite/
Im folgenden Beispiel werden alle Dateien hinzugefügt, die mit "config" beginnen, zum c:\temp
Verzeichnis des Containerimages.
ADD config* c:/temp/
Im folgenden Beispiel wird Python für Windows in das c:\temp
Verzeichnis 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 fest, z. B. RUN
, CMD
, und das Arbeitsverzeichnis für die Ausführung von Instanzen des Containerimages.
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.
CMD
Die CMD
Anweisung legt den Standardbefehl fest, der beim Bereitstellen einer Instanz des Containerimages ausgeführt werden soll. Wenn der Container beispielsweise einen NGINX-Webserver hosten wird, enthält die CMD
möglicherweise Anweisungen zum Starten des Webservers mit einem Befehl wie nginx.exe
. Wenn mehrere CMD
Anweisungen in einer Dockerfile angegeben werden, 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. Nachfolgend sind gültige CMD
-Anweisungen aufgeführt:
# exec form
CMD ["c:\\Apache24\\bin\\httpd.exe", "-w"]
# shell form
CMD c:\\Apache24\\bin\\httpd.exe -w
Das folgende Format ohne die richtigen 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
In vielen Fällen muss eine Dockerfile-Anweisung mehrere Zeilen umfassen. Dazu können Sie ein Escape-Zeichen 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. Um dies zu umgehen, können Sie eine Parserdirektive verwenden, um das Standardmäßige Escapezeichen zu ändern. Weitere Informationen zu Parserdirektiven finden Sie unter Parser-Direktiven.
Das folgende Beispiel zeigt eine einzelne RUN-Anweisung, die mehrere Zeilen mit dem Standard-Escapezeichen umfasst:
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
Um das Escapezeichen zu ändern, platzieren Sie eine Escapeparserdirektive in der ersten Zeile der Dockerfile-Datei. Dies ist im folgenden Beispiel zu sehen.
Anmerkung
Es können nur zwei Werte 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 Escapeparser-Direktive finden Sie unter Escapeparser-Direktive.
PowerShell in Dockerfile
PowerShell-Cmdlets
PowerShell-Cmdlets können in einer Dockerfile-Datei mit dem RUN
-Vorgang ausgeführt werden.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath c:\
REST-Aufrufe
Das Invoke-WebRequest
-Cmdlet von PowerShell kann beim Sammeln von Informationen oder Dateien aus einem Webdienst hilfreich sein. Wenn Sie beispielsweise ein Image erstellen, das Python enthält, können Sie $ProgressPreference
auf SilentlyContinue
festlegen, um schnellere Downloads zu erzielen, wie im folgenden Beispiel gezeigt.
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
Anmerkung
Invoke-WebRequest
funktioniert auch auf dem Nano Server.
Eine weitere Option für die Verwendung von PowerShell zum Herunterladen von Dateien während des Bilderstellungsprozesses ist die Verwendung der .NET WebClient-Bibliothek. Dies kann die Downloadleistung erhöhen. Im folgenden Beispiel wird die Python-Software mithilfe 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
Anmerkung
Nano Server unterstützt derzeit webClient nicht.
PowerShell-Skripts
In einigen Fällen kann es hilfreich sein, ein Skript in die Container zu kopieren, die Sie während des Imageerstellungsprozesses verwenden, und dann das Skript aus dem Container ausführen.
Anmerkung
Hierdurch wird das Zwischenspeichern von Imageebenen eingeschränkt und die Lesbarkeit der Dockerfile verringert.
In diesem Beispiel wird mithilfe der ADD
-Anweisung ein Skript vom Buildcomputer 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
Nachdem eine Dockerfile erstellt und auf dem Datenträger gespeichert wurde, können Sie docker build
ausführen, um das neue Image zu erstellen. Der docker build
-Befehl nimmt mehrere optionale Parameter und einen Pfad zur Dockerfile an. Vollständige Dokumentation zu Docker Build, einschließlich einer Liste aller Buildoptionen, finden Sie in der Buildreferenz.
Das Format des Befehls docker build
sieht wie folgt aus:
docker build [OPTIONS] PATH
Mit dem folgenden Befehl wird beispielsweise ein Bild mit dem Namen "iis" erstellt.
docker build -t iis .
Wenn der Buildprozess initiiert wurde, gibt die Ausgabe den Status an und gibt alle ausgelösten Fehler zurück.
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" hat.
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