Dela via


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/servercorehä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, CMDoch ä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

Ytterligare läsning och referenser