Freigeben über


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/servercoreverwenden, 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

Weitere Lektüre und Referenzen