Dockerfile i Windows
Docker-motorn innehåller verktyg som automatiserar skapandet av containeravbildningar. Du kan skapa containeravbildningar manuellt genom att köra kommandot docker commit
, men det finns många fördelar med att skapa en automatiserad avbildningsprocess, bland annat:
- Lagra containeravbildningar som kod.
- Snabb och exakt återskapning av containeravbildningar i underhålls- och uppgraderingssyfte.
- Kontinuerlig integrering mellan containeravbildningar och utvecklingscykeln.
Docker-komponenterna som driver den här automatiseringen är Dockerfile och kommandot docker build
.
Dockerfile är en textfil som innehåller de instruktioner som krävs för att skapa en ny containeravbildning. Dessa instruktioner omfattar identifiering av en befintlig avbildning som ska användas som bas, kommandon som ska köras under avbildningens skapandeprocess och ett kommando som körs när nya instanser av containeravbildningen distribueras.
Docker build är dockermotorkommandot som använder en Dockerfile och utlöser bildskapandeprocessen.
Det här avsnittet visar hur du använder Dockerfiles med Windows-containrar, förstår deras grundläggande syntax och vilka de vanligaste Dockerfile-instruktionerna är.
I det här dokumentet beskrivs begreppet containeravbildningar och containeravbildningslager. Om du vill veta mer om avbildningar och bildskikt kan du läsa containerbasavbildningar.
En fullständig titt på Dockerfiles finns i referensen Dockerfile.
Grundläggande syntax
I sin mest grundläggande form kan en Dockerfile vara mycket enkel. I följande exempel skapas en ny avbildning, som innehåller IIS, och en "hello world"-webbplats. Det här exemplet innehåller kommentarer (visas med en #
), som förklarar varje steg. Efterföljande avsnitt i den här artikeln går in mer detaljerat på Dockerfile-syntaxregler och Dockerfile-instruktioner.
Anmärkning
En Dockerfile måste skapas utan tillägg. Om du vill göra detta i Windows skapar du filen med valfri redigerare och sparar den sedan med notationen "Dockerfile" (inklusive citattecken).
# 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" ]
Ytterligare exempel på Dockerfiles för Windows finns i Dockerfile för Windows-lagringsplatsen.
Instruktioner
Dockerfile-instruktioner ger Docker-motorn de instruktioner som krävs för att skapa en containeravbildning. Dessa instruktioner utförs en i taget och i ordning. Följande exempel är de vanligaste instruktionerna i Dockerfiles. En fullständig lista över Dockerfile-instruktioner finns i referensen Dockerfile.
FRÅN
Instruktionen FROM
anger den containeravbildning som ska användas under den nya processen för att skapa avbildningar. När du till exempel använder instruktionen FROM mcr.microsoft.com/windows/servercore
härleds den resulterande avbildningen från och har ett beroende av Windows Server Core-basoperativsystemets avbildning. Om den angivna avbildningen inte finns i systemet där Docker-byggprocessen körs försöker Docker-motorn ladda ned avbildningen från ett offentligt eller privat avbildningsregister.
FROM-instruktionens format går så här:
FROM <image>
Här är ett exempel på FROM-kommandot:
Så här laddar du ned windows server core-versionen ltsc2019 från Microsoft Container Registry (MCR):
FROM mcr.microsoft.com/windows/servercore:ltsc2019
Mer detaljerad information finns i referensen FROM.
SPRING
Instruktionen RUN
anger vilka kommandon som ska köras och samlas in i den nya containeravbildningen. Dessa kommandon kan omfatta objekt som att installera programvara, skapa filer och kataloger och skapa miljökonfiguration.
Run-instruktionen går så här:
# exec form
RUN ["<executable>", "<param 1>", "<param 2>"]
# shell form
RUN <command>
Skillnaden mellan exec- och shell-formuläret är hur den RUN
instruktionen körs. När du använder exec-formuläret körs det angivna programmet explicit.
Här är ett exempel på exec-formuläret:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN ["powershell", "New-Item", "c:/test"]
Den resulterande avbildningen kör kommandot 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
I följande exempel körs däremot samma åtgärd i gränssnittsform:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell New-Item c:\test
Den resulterande avbildningen har en körningsinstruktion på 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
Överväganden för att använda RUN med Windows
I Windows, när du använder instruktionen RUN
med exec-formatet, måste omvänt snedstreck maskeras.
RUN ["powershell", "New-Item", "c:\\test"]
När målprogrammet är ett Windows-installationsprogram måste du extrahera installationen via flaggan /x:<directory>
innan du kan starta den faktiska (tysta) installationsproceduren. Du måste också vänta tills kommandot avslutas innan du gör något annat. Annars avslutas processen i förtid utan att installera något. Mer information finns i exemplet nedan.
Exempel på användning av RUN med Windows
I följande exempel använder Dockerfile DISM för att installera IIS i containeravbildningen:
RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart
I det här exemplet installeras det omdistribuerbara Visual Studio-paketet.
Start-Process
och parametern -Wait
används för att köra installationsprogrammet. Detta säkerställer att installationen slutförs innan du går vidare till nästa instruktion i Dockerfile.
RUN powershell.exe -Command Start-Process c:\vcredist_x86.exe -ArgumentList '/quiet' -Wait
Detaljerad information om RUN-instruktionen finns i RUN-referensen.
KOPIA
Instruktionen COPY
kopierar filer och kataloger till containerns filsystem. Filerna och katalogerna måste finnas i en sökväg i förhållande till Dockerfile.
COPY
-instruktionens format ser ut så här:
COPY <source> <destination>
Om antingen källan eller målet innehåller tomt utrymme omger du sökvägen inom hakparenteser och dubbla citattecken, som du ser i följande exempel:
COPY ["<source>", "<destination>"]
Överväganden för att använda COPY med Windows
I Windows måste målformatet använda snedstreck. Dessa är till exempel giltiga COPY
instruktioner:
COPY test1.txt /temp/
COPY test1.txt c:/temp/
Under tiden fungerar inte följande format med omvänt snedstreck:
COPY test1.txt c:\temp\
Exempel på hur du använder COPY med Windows
I följande exempel läggs innehållet i källkatalogen till i en katalog med namnet sqllite
i containeravbildningen:
COPY source /sqlite/
I följande exempel läggs alla filer som börjar med konfigurationen till c:\temp
-katalogen för containeravbildningen:
COPY config* c:/temp/
Mer detaljerad information om COPY
-instruktionen finns i COPY-referensen.
ADDERA
ADD-instruktionen är som COPY-instruktionen, men med ännu fler funktioner. Förutom att kopiera filer från värden till containerbilden kan ADD
-instruktionen även kopiera filer från en avlägsen plats med en URL-specifikation.
ADD
-instruktionens format ser ut så här:
ADD <source> <destination>
Om källan eller målet innehåller tomt utrymme omger du sökvägen inom hakparenteser och dubbla citattecken:
ADD ["<source>", "<destination>"]
Överväganden för att köra ADD med Windows
I Windows måste målformatet använda snedstreck. Dessa är till exempel giltiga ADD
instruktioner:
ADD test1.txt /temp/
ADD test1.txt c:/temp/
Under tiden fungerar inte följande format med omvänt snedstreck:
ADD test1.txt c:\temp\
I Linux expanderar dessutom instruktionen ADD
komprimerade paket vid kopiering. Den här funktionen är inte tillgänglig i Windows.
Exempel på hur du använder ADD med Windows
I följande exempel läggs innehållet i källkatalogen till i en katalog med namnet sqllite
i containeravbildningen:
ADD source /sqlite/
I följande exempel läggs alla filer som börjar med "config" till c:\temp
-katalogen för containeravbildningen.
ADD config* c:/temp/
I följande exempel laddas Python för Windows ned till c:\temp
-katalogen för containeravbildningen.
ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe
Mer detaljerad information om instruktionen för ADD
finns i ADD-referens.
WORKDIR
Instruktionen WORKDIR
anger en arbetskatalog för andra Dockerfile-instruktioner, till exempel RUN
, CMD
och även arbetskatalogen för att köra instanser av containeravbildningen.
WORKDIR
-instruktionens format ser ut så här:
WORKDIR <path to working directory>
Överväganden för att använda WORKDIR med Windows
Om arbetskatalogen innehåller ett omvänt snedstreck i Windows måste den vara undantagen.
WORKDIR c:\\windows
Exempel
WORKDIR c:\\Apache24\\bin
Detaljerad information om WORKDIR
-instruktionen finns i WORKDIR-referensen.
CMD
I instruktionen CMD
anges standardkommandot som ska köras när du distribuerar en instans av containeravbildningen. Om containern till exempel är värd för en NGINX-webbserver kan CMD
innehålla instruktioner för att starta webbservern med ett kommando som nginx.exe
. Om flera CMD
instruktioner anges i en Dockerfile utvärderas endast den sista.
CMD
-instruktionens format ser ut så här:
# exec form
CMD ["<executable", "<param>"]
# shell form
CMD <command>
Överväganden för att använda CMD med Windows
I Windows måste filsökvägar som anges i instruktionen CMD
använda snedstreck eller ha undantagna omvänt snedstreck \\
. Följande är giltiga CMD
instruktioner:
# exec form
CMD ["c:\\Apache24\\bin\\httpd.exe", "-w"]
# shell form
CMD c:\\Apache24\\bin\\httpd.exe -w
Men följande format utan rätt snedstreck fungerar inte:
CMD c:\Apache24\bin\httpd.exe -w
Mer detaljerad information om CMD
-instruktionen finns i CMD-referensen.
Escape-tecken
I många fall måste en Dockerfile-instruktion sträcka sig över flera rader. Om du vill göra det kan du använda ett escape-tecken. Standardutrymningstecknet för Dockerfile är ett omvänt snedstreck \
. Eftersom det omvända snedstrecket också är en filsökvägsavgränsare i Windows kan det orsaka problem att använda det för att sträcka sig över flera rader. För att komma runt detta kan du använda ett parser-direktiv för att ändra standardtecken för escape. Mer information om parser-direktiv finns i Parser-direktiv.
I följande exempel visas en enda RUN-instruktion som sträcker sig över flera rader med standardutrymningstecknet:
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
Om du vill ändra escape-tecknet placerar du ett escape-parser-direktiv på den allra första raden i Dockerfile. Detta visas i följande exempel.
Notera
Endast två värden kan användas som escape-tecken: \
och `
.
# 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
Mer information om escape-parser-direktivet finns i Escape-parser-direktivet.
PowerShell i Dockerfile
PowerShell-cmdlets
PowerShell-cmdletar kan köras i en Dockerfile med åtgärden RUN
.
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath c:\
REST-anrop
PowerShells Invoke-WebRequest
-cmdlet kan vara användbar när du samlar in information eller filer från en webbtjänst. Om du till exempel skapar en avbildning som innehåller Python kan du ange $ProgressPreference
till SilentlyContinue
för att få snabbare nedladdningar, som du ser i följande exempel.
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
Notera
Invoke-WebRequest
fungerar också i Nano Server.
Ett annat alternativ för att använda PowerShell för att ladda ned filer när avbildningen skapas är att använda .NET WebClient-biblioteket. Detta kan öka nedladdningsprestandan. I följande exempel laddas Python-programvaran ned med hjälp av WebClient-biblioteket.
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
Anteckning
Nano Server stöder för närvarande inte WebClient.
PowerShell-skript
I vissa fall kan det vara bra att kopiera ett skript till de containrar som du använder under processen för att skapa avbildningen och sedan köra skriptet inifrån containern.
Anteckning
Detta begränsar cachelagring av bildlager och minskar Dockerfilens läsbarhet.
I det här exemplet kopieras ett skript från byggdatorn till containern med hjälp av instruktionen ADD
. Det här skriptet körs sedan med run-instruktionen.
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
När en Dockerfile har skapats och sparats på disk kan du köra docker build
för att skapa den nya avbildningen. Kommandot docker build
tar flera valfria parametrar och en sökväg till Dockerfile. Fullständig dokumentation om Docker Build, inklusive en lista över alla byggalternativ, finns i build-referensen.
Formatet för kommandot docker build
ser ut så här:
docker build [OPTIONS] PATH
Följande kommando skapar till exempel en avbildning med namnet "iis".
docker build -t iis .
När byggprocessen har initierats visar utdata statusen och returnerar eventuella fel som utlöses.
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
Resultatet är en ny containeravbildning som i det här exemplet heter "iis".
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