Dockerfile in Windows
De Docker engine bevat hulpprogramma's die het maken van containerafbeeldingen automatiseren. Hoewel u containerinstallatiekopieën handmatig kunt maken door de opdracht docker commit
uit te voeren, heeft het maken van een geautomatiseerde installatiekopie veel voordelen, waaronder:
- Containerafbeeldingen opslaan als code.
- Snelle en nauwkeurige hercreatie van containerafbeeldingen voor onderhouds- en upgrade doeleinden.
- Continue integratie tussen containerafbeeldingen en de ontwikkelingscyclus.
De Docker-onderdelen die deze automatisering aandrijven, zijn de Dockerfile en de opdracht docker build
.
De Dockerfile is een tekstbestand met de instructies die nodig zijn om een nieuwe containerimage te maken. Deze instructies omvatten de identificatie van een bestaande installatiekopie die moet worden gebruikt als basis, opdrachten die moeten worden uitgevoerd tijdens het maken van de installatiekopie en een opdracht die wordt uitgevoerd wanneer nieuwe exemplaren van de containerinstallatiekopie worden geïmplementeerd.
Docker build is het Docker Engine-commando dat een Dockerfile gebruikt en het proces voor het maken van de image activeert.
In dit onderwerp wordt beschreven hoe u Dockerfiles gebruikt met Windows-containers, hoe u de basissyntaxis begrijpt en wat de meest voorkomende Dockerfile-instructies zijn.
In dit document wordt het concept van containerbeelden en containerbeeldlagen besproken. Als u meer wilt weten over containerbasisafbeeldingen en afbeeldingslagen, zie containerbasisafbeeldingen.
Raadpleeg de Dockerfile-referentievoor een compleet overzicht van Dockerfiles.
Basissyntaxis
In de meest eenvoudige vorm kan een Dockerfile heel eenvoudig zijn. In het volgende voorbeeld wordt een nieuwe image gemaakt, die IIS en een 'Hello World'-site bevat. Dit voorbeeld bevat opmerkingen (aangegeven met een #
), waarin elke stap wordt uitgelegd. In volgende secties van dit artikel vindt u meer informatie over de syntaxisregels van Dockerfile en instructies voor Dockerfile.
Notitie
Er moet een Dockerfile worden gemaakt zonder extensie. Als u dit in Windows wilt doen, maakt u het bestand met de gewenste editor en slaat u het op met de notatie Dockerfile (inclusief de aanhalingstekens).
# 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" ]
Zie de Dockerfile voor Windows-opslagplaatsvoor meer voorbeelden van Dockerfiles voor Windows.
Aanwijzingen
Dockerfile-instructies geven de Docker Engine de instructies die het nodig heeft om een containerimage te maken. Deze instructies worden één voor één uitgevoerd en in volgorde. De volgende voorbeelden zijn de meestgebruikte instructies in Dockerfiles. Zie de Dockerfile-verwijzingvoor een volledige lijst met Dockerfile-instructies.
VAN
Met de FROM
instructie wordt de containerafbeelding ingesteld die wordt gebruikt tijdens het maken van de nieuwe afbeelding. Wanneer u bijvoorbeeld de instructie FROM mcr.microsoft.com/windows/servercore
gebruikt, is de resulterende afbeelding afgeleid van, en afhankelijk van, de basis-OS-afbeelding van Windows Server Core. Als de opgegeven installatiekopieën niet aanwezig zijn op het systeem waarop het Docker-buildproces wordt uitgevoerd, probeert de Docker-engine de installatiekopieën te downloaden uit een openbaar of persoonlijk installatiekopieënregister.
De indeling van de FROM-instructie ziet er als volgt uit:
FROM <image>
Hier volgt een voorbeeld van de OPDRACHT FROM:
De windows server core van de ltsc2019-versie downloaden uit het Microsoft Container Registry (MCR):
FROM mcr.microsoft.com/windows/servercore:ltsc2019
Zie de FROM-verwijzingvoor meer gedetailleerde informatie.
RENNEN
De RUN
-instructie specificeert opdrachten die moeten worden uitgevoerd en vastgelegd in de nieuwe containerafbeelding. Deze opdrachten kunnen items bevatten, zoals het installeren van software, het maken van bestanden en mappen en het maken van de omgevingsconfiguratie.
De RUN-instructie gaat als volgt:
# exec form
RUN ["<executable>", "<param 1>", "<param 2>"]
# shell form
RUN <command>
Het verschil tussen het exec- en shell-formulier is de wijze waarop de RUN
instructie wordt uitgevoerd. Wanneer u het exec-formulier gebruikt, wordt het opgegeven programma expliciet uitgevoerd.
Hier volgt een voorbeeld van het exec-formulier:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN ["powershell", "New-Item", "c:/test"]
De resulterende afbeelding voert de opdracht powershell New-Item c:/test
uit.
docker history doc-exe-method
IMAGE CREATED CREATED BY SIZE COMMENT
b3452b13e472 2 minutes ago powershell New-Item c:/test 30.76 MB
In het volgende voorbeeld wordt dezelfde bewerking uitgevoerd in shell-vorm:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell New-Item c:\test
De resulterende afbeelding heeft een uitvoeringsinstructie van 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
Overwegingen voor het gebruik van RUN met Windows
Wanneer u in Windows de instructie RUN
met de exec-indeling gebruikt, moeten backslashes worden geëscaped.
RUN ["powershell", "New-Item", "c:\\test"]
Wanneer het doelprogramma een Windows Installer is, moet u de installatie extraheren via de /x:<directory>
vlag voordat u de daadwerkelijke (stille) installatieprocedure kunt starten. U moet ook wachten totdat de opdracht wordt afgesloten voordat u iets anders doet. Anders wordt het proces voortijdig beëindigd zonder iets te installeren. Raadpleeg het onderstaande voorbeeld voor meer informatie.
Voorbeelden van het gebruik van RUN met Windows
Het volgende voorbeeld-Dockerfile gebruikt DISM om IIS te installeren in de container-image.
RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart
In dit voorbeeld wordt het herdistribueerbare Pakket van Visual Studio geïnstalleerd.
Start-Process
en de parameter -Wait
worden gebruikt om het installatieprogramma uit te voeren. Dit zorgt ervoor dat de installatie is voltooid voordat u verdergaat met de volgende instructie in het Dockerfile.
RUN powershell.exe -Command Start-Process c:\vcredist_x86.exe -ArgumentList '/quiet' -Wait
Zie de RUN-verwijzingvoor gedetailleerde informatie over de RUN-instructie.
KOPIËREN
De COPY
instructie kopieert bestanden en mappen naar het bestandssysteem van de container. De bestanden en mappen moeten zich in een pad bevinden ten opzichte van het Dockerfile.
De indeling van de COPY
-instructie ziet er als volgt uit:
COPY <source> <destination>
Als een bron of bestemming witruimte bevat, plaatst u het pad tussen vierkante haken en dubbele aanhalingstekens, zoals wordt weergegeven in het volgende voorbeeld:
COPY ["<source>", "<destination>"]
Overwegingen voor het gebruik van COPY met Windows
In Windows moet de doelindeling schuine strepen gebruiken. Dit zijn bijvoorbeeld geldige COPY
instructies:
COPY test1.txt /temp/
COPY test1.txt c:/temp/
Ondertussen werkt de volgende indeling met backslashes niet:
COPY test1.txt c:\temp\
Voorbeelden van het gebruik van COPY met Windows
In het volgende voorbeeld wordt de inhoud van de bronmapdirectory toegevoegd aan een directory genaamd sqllite
in de containerimage.
COPY source /sqlite/
In het volgende voorbeeld worden alle bestanden die beginnen met config toegevoegd aan de map c:\temp
van de container-image.
COPY config* c:/temp/
Zie de COPY-verwijzingvoor meer gedetailleerde informatie over de instructie COPY
.
TOEVOEGEN
De INSTRUCTIE ADD is net als de COPY-instructie, maar met nog meer mogelijkheden. Naast het kopiëren van bestanden van de host naar de containerinstallatiekopie, kan de ADD
instructie ook bestanden kopiëren vanaf een externe locatie met een URL-specificatie.
De indeling van de ADD
-instructie ziet er als volgt uit:
ADD <source> <destination>
Als de bron of het doel witruimte bevat, plaatst u het pad tussen vierkante haken en dubbele aanhalingstekens:
ADD ["<source>", "<destination>"]
Overwegingen voor het uitvoeren van ADD met Windows
Op Windows moet het doelformaat voorwaartse schuine strepen gebruiken. Dit zijn bijvoorbeeld geldige ADD
instructies:
ADD test1.txt /temp/
ADD test1.txt c:/temp/
Ondertussen werkt het volgende formaat met backslashes niet:
ADD test1.txt c:\temp\
Bovendien zal op Linux de ADD
-instructie gecomprimeerde pakketten tijdens het kopiëren uitpakken. Deze functionaliteit is niet beschikbaar in Windows.
Voorbeelden van het gebruik van ADD met Windows
In het volgende voorbeeld wordt de inhoud van de bronmap geplaatst in een map met de naam sqllite
in de containerimage.
ADD source /sqlite/
In het volgende voorbeeld worden alle bestanden die beginnen met 'config' toegevoegd aan de c:\temp
-map van de containerimage.
ADD config* c:/temp/
In het volgende voorbeeld wordt Python voor Windows gedownload naar de c:\temp
directory van de containerimage.
ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe
Zie de ADD-verwijzingvoor meer gedetailleerde informatie over de ADD
instructie.
WORKDIR
De WORKDIR
-instructie stelt een werkmap in voor andere Dockerfile-instructies, zoals RUN
en CMD
, evenals de werkmap voor het uitvoeren van instanties van de containerimage.
De indeling van de WORKDIR
-instructie ziet er als volgt uit:
WORKDIR <path to working directory>
Overwegingen voor het gebruik van WORKDIR met Windows
Als in Windows de werkmap een backslash bevat, moet deze worden ontsnapt.
WORKDIR c:\\windows
voorbeelden
WORKDIR c:\\Apache24\\bin
Zie de WORKDIR-verwijzingvoor gedetailleerde informatie over de WORKDIR
instructie.
CMD
Met de instructie CMD
wordt de standaardopdracht ingesteld die moet worden uitgevoerd bij het implementeren van een exemplaar van de containerinstallatiekopie. Als de container bijvoorbeeld als host fungeert voor een NGINX-webserver, bevat de CMD
mogelijk instructies voor het starten van de webserver met een opdracht zoals nginx.exe
. Als er meerdere CMD
instructies zijn opgegeven in een Dockerfile, wordt alleen de laatste geëvalueerd.
De indeling van de CMD
-instructie ziet er als volgt uit:
# exec form
CMD ["<executable", "<param>"]
# shell form
CMD <command>
Overwegingen voor het gebruik van CMD met Windows
In Windows moeten bestandspaden die zijn opgegeven in de instructie CMD
voorwaartse schuine strepen gebruiken of ontsnapte backslashes \\
. Hier volgen geldige CMD
instructies:
# exec form
CMD ["c:\\Apache24\\bin\\httpd.exe", "-w"]
# shell form
CMD c:\\Apache24\\bin\\httpd.exe -w
De volgende indeling zonder de juiste slashes werkt echter niet:
CMD c:\Apache24\bin\httpd.exe -w
Zie de CMD-verwijzingvoor meer gedetailleerde informatie over de CMD
instructie.
Escape-teken
In veel gevallen moet een Dockerfile-instructie meerdere regels omvatten. Hiervoor kunt u een escape-teken gebruiken. Het standaard escapeteken in een Dockerfile is een backslash \
. Omdat de backslash echter ook als scheidingsteken voor bestandspaden in Windows wordt gebruikt, kan het gebruik ervan om meerdere regels te overspannen problemen veroorzaken. U kunt dit omzeilen door een parser-instructie te gebruiken om het standaard escape-teken te wijzigen. Zie Parser-instructiesvoor meer informatie over parserrichtlijnen.
In het volgende voorbeeld ziet u één RUN-instructie die meerdere regels omvat met behulp van het standaard escape-teken:
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
Als u het escape-teken wilt wijzigen, plaatst u een escape parser-instructie op de eerste regel van het Dockerfile. Dit is te zien in het volgende voorbeeld.
Notitie
Er kunnen slechts twee waarden worden gebruikt als escapetekens: \
en `
.
# 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
Zie Escape parser directivevoor meer informatie over de escape parser richtlijn.
PowerShell in Dockerfile
PowerShell-cmdlets
PowerShell-cmdlets kunnen worden uitgevoerd in een Dockerfile met de RUN
bewerking.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath c:\
REST-aanroepen
De Invoke-WebRequest
cmdlet van PowerShell kan handig zijn bij het verzamelen van gegevens of bestanden van een webservice. Als u bijvoorbeeld een image met Python maakt, kunt u $ProgressPreference
naar SilentlyContinue
instellen om snellere downloads te bereiken, zoals in het volgende voorbeeld wordt weergegeven.
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
Notitie
Invoke-WebRequest
werkt ook in Nano Server.
Een andere optie voor het gebruik van PowerShell voor het downloaden van bestanden tijdens het maken van de installatiekopie is het gebruik van de .NET WebClient-bibliotheek. Dit kan de downloadprestaties verbeteren. In het volgende voorbeeld wordt de Python-software gedownload met behulp van de WebClient-bibliotheek.
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
Notitie
Nano Server biedt momenteel geen ondersteuning voor WebClient.
PowerShell-scripten
In sommige gevallen kan het handig zijn om een script te kopiëren naar de containers die u gebruikt tijdens het maken van de installatiekopie en vervolgens het script vanuit de container uit te voeren.
Notitie
Hierdoor wordt de cache van de afbeeldingslaag beperkt en wordt de leesbaarheid van Dockerfile verminderd.
In dit voorbeeld wordt een script van de buildcomputer gekopieerd naar de container met behulp van de instructie ADD
. Dit script wordt vervolgens uitgevoerd met behulp van de RUN-instructie.
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
Zodra een Dockerfile is gemaakt en opgeslagen op schijf, kunt u docker build
uitvoeren om de nieuwe afbeelding te maken. De opdracht docker build
gebruikt verschillende optionele parameters en een pad naar het Dockerfile. Zie de build-verwijzingvoor volledige documentatie over Docker Build, inclusief een lijst met alle buildopties.
De indeling van de opdracht docker build
gaat als volgt:
docker build [OPTIONS] PATH
Bijvoorbeeld, de volgende opdracht maakt een image met de naam "iis".
docker build -t iis .
Wanneer het buildproces is gestart, geeft de uitvoer de status aan en retourneert de gegenereerde fouten.
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
Het resultaat is een nieuwe containerafbeelding, die in dit voorbeeld 'iis' heet.
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