Sdílet prostřednictvím


Dockerfile ve Windows

Modul Docker obsahuje nástroje, které automatizují vytváření imagí kontejneru. I když image kontejneru můžete vytvářet ručně spuštěním příkazu docker commit, přijetí automatizovaného procesu vytváření imagí má mnoho výhod, mezi které patří:

  • Ukládání imagí kontejneru jako kódu
  • Rychlé a přesné vytvoření obrazů kontejnerů pro účely údržby a aktualizace.
  • Kontinuální integrace mezi obrazy kontejnerů a vývojovým cyklem.

Komponenty Dockeru, které tuto automatizaci řídí, jsou dockerfile a příkaz docker build.

Dockerfile je textový soubor, který obsahuje pokyny potřebné k vytvoření nové image kontejneru. Tyto pokyny zahrnují identifikaci existující image, která se má použít jako základ, příkazy ke spuštění během procesu vytváření image a příkaz, který se spustí při nasazení nových instancí image kontejneru.

Docker build je příkaz modulu Dockeru, který využívá soubor Dockerfile a aktivuje proces vytvoření image.

V tomto tématu se dozvíte, jak používat soubory Dockerfile s kontejnery Windows, pochopit jejich základní syntaxi a jaké jsou nejběžnější pokyny k souboru Dockerfile.

Tento dokument popisuje koncept imagí kontejnerů a vrstev imagí kontejnerů. Pokud chcete získat další informace o obrázcích a vrstvení obrázků, přečtěte si základní obrázky kontejneru.

Úplný přehled souborů Dockerfile najdete v referenčním souboru Dockerfile.

Základní syntaxe

Ve své nejzásadnější podobě může být soubor Dockerfile velmi jednoduchý. Následující příklad vytvoří novou image, která obsahuje službu IIS a web hello world. Tento příklad obsahuje komentáře (označené #), které vysvětlují jednotlivé kroky. Další části tohoto článku se podrobněji zaměří na pravidla syntaxe souboru Dockerfile a pokyny k souboru Dockerfile.

Poznámka

Soubor Dockerfile se musí vytvořit bez přípony. Pokud to chcete udělat ve Windows, vytvořte soubor s zvoleným editorem a uložte ho s notací Dockerfile (včetně uvozovek).

# 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" ]

Další příklady souborů Dockerfile pro Windows najdete v Souboru Dockerfile pro úložiště Windows.

Instrukce

Pokyny k souboru Dockerfile poskytují modulu Dockeru pokyny, které potřebuje k vytvoření image kontejneru. Tyto pokyny se provádějí postupně a v pořadí. Následující příklady jsou nejčastěji používané pokyny v souborech Dockerfile. Úplný seznam pokynů v Dockerfile najdete v referenci Dockerfile.

OD

Instrukce FROM nastaví image kontejneru, která se použije během procesu vytváření nové image. Například při použití instrukce FROM mcr.microsoft.com/windows/servercoreje výsledná image odvozena a má závislost na základní imagi operačního systému Windows Server. Pokud zadaná image není v systému, ve kterém se spouští proces sestavení Dockeru, pokusí se modul Dockeru stáhnout image z veřejného nebo privátního registru imagí.

Formát instrukce FROM vypadá takto:

FROM <image>

Tady je příklad příkazu FROM:

Stažení jádra Windows Serveru verze ltsc2019 ze služby Microsoft Container Registry (MCR):

FROM mcr.microsoft.com/windows/servercore:ltsc2019

Pro podrobnější informace se podívejte na odkaz Z.

BĚŽET

Instrukce RUN určuje příkazy, které se mají spustit, a zachytává se do nové image kontejneru. Tyto příkazy můžou zahrnovat položky, jako je instalace softwaru, vytváření souborů a adresářů a vytváření konfigurace prostředí.

Instrukce RUN vypadá takto:

# exec form

RUN ["<executable>", "<param 1>", "<param 2>"]

# shell form

RUN <command>

Rozdíl mezi formulářem exec a shell spočívá v tom, jak se spustí RUN instrukce. Při použití formuláře exec se zadaný program spustí explicitně.

Tady je příklad formuláře exec:

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN ["powershell", "New-Item", "c:/test"]

Výsledná image spustí příkaz 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

Naproti tomu následující příklad spustí stejnou operaci ve skořápkové formě.

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell New-Item c:\test

Výsledný obrázek má instrukci spuštění 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

Důležité informace o používání run s Windows

Při použití instrukce RUN ve windows ve formátu exec musí být zpětná lomítka uchvácená.

RUN ["powershell", "New-Item", "c:\\test"]

Pokud je cílovým programem instalační služba systému Windows, budete muset před spuštěním skutečného (tichého) postupu instalace extrahovat instalační program prostřednictvím příznaku /x:<directory>. Před provedením čehokoli jiného musíte také počkat, než se příkaz ukončí. Jinak se proces předčasně ukončí bez instalace čehokoli. Podrobnosti najdete v následujícím příkladu.

Příklady použití příkazu RUN s Windows

Následující příklad Dockerfile používá DISM k instalaci služby IIS v image kontejneru.

RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart

Tento příklad nainstaluje distribuovatelný balíček sady Visual Studio. Start-Process a parametr -Wait slouží ke spuštění instalačního programu. Tím se zajistí, že se instalace dokončí před přechodem na další instrukce v souboru Dockerfile.

RUN powershell.exe -Command Start-Process c:\vcredist_x86.exe -ArgumentList '/quiet' -Wait

Podrobné informace o instrukci RUN naleznete v RUN referenční.

KOPÍROVAT

Instrukce COPY zkopíruje soubory a adresáře do systému souborů kontejneru. Soubory a adresáře musí být v cestě relativní k souboru Dockerfile.

Formát instrukce COPY vypadá takto:

COPY <source> <destination>

Pokud zdroj nebo cíl obsahuje prázdné znaky, uzavřete cestu do hranatých závorek a dvojitých uvozovek, jak je znázorněno v následujícím příkladu:

COPY ["<source>", "<destination>"]

Důležité informace o používání funkce COPY ve Windows

Na Windows musí cílový formát používat přední lomítka. Například, toto jsou platné pokyny COPY:

COPY test1.txt /temp/
COPY test1.txt c:/temp/

Mezitím následující formát s zpětnými lomítky nebude fungovat:

COPY test1.txt c:\temp\

Příklady použití funkce COPY s Windows

Následující příklad přidá obsah zdrojového adresáře do adresáře s názvem sqllite v imagi kontejneru:

COPY source /sqlite/

Následující příklad přidá všechny soubory, které začínají konfigurací do c:\temp adresáře image kontejneru:

COPY config* c:/temp/

Podrobnější informace o COPY instrukci naleznete v COPY odkazu.

PŘIDAT

Instrukce ADD se podobá instrukci COPY, ale s dalšími možnostmi. Kromě kopírování souborů z hostitele do image kontejneru může instrukce ADD také kopírovat soubory ze vzdáleného umístění se specifikací adresy URL.

Formát instrukce ADD vypadá takto:

ADD <source> <destination>

Pokud zdroj nebo cíl obsahuje prázdné znaky, uzavřete cestu do hranatých závorek a dvojitých uvozovek:

ADD ["<source>", "<destination>"]

Úvahy o spuštění ADD s Windows

Ve Windows musí cílový formát používat lomítka dopředu. Toto jsou například platné ADD pokyny:

ADD test1.txt /temp/
ADD test1.txt c:/temp/

Mezitím následující formát se zpětnými lomítky nebude fungovat:

ADD test1.txt c:\temp\

Kromě toho v Linuxu instrukce ADD rozšíří komprimované balíčky při kopírování. Tato funkce není ve Windows dostupná.

Příklady použití ADD ve Windows

Následující příklad přidá obsah zdrojového adresáře do adresáře s názvem sqllite v imagi kontejneru:

ADD source /sqlite/

Následující příklad přidá všechny soubory, které začínají "config" do c:\temp adresáře image kontejneru.

ADD config* c:/temp/

Následující příklad stáhne Python pro Windows do adresáře c:\temp kontejnerového obrazu.

ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe

Podrobnější informace o ADD instrukce naleznete v ADD reference.

WORKDIR (pracovní adresář)

Instrukce WORKDIR nastaví pracovní adresář pro jiné instrukce dockerfile, jako jsou RUN, CMDa také pracovní adresář pro spouštění instancí image kontejneru.

Formát instrukce WORKDIR vypadá takto:

WORKDIR <path to working directory>

Důležité informace o používání nástroje WORKDIR s Windows

Pokud adresář pro práci obsahuje zpětné lomítko, musí být ve Windows upravené pomocí escape.

WORKDIR c:\\windows

Příklady

WORKDIR c:\\Apache24\\bin

Podrobné informace o instrukci WORKDIR naleznete v odkazu WORKDIR.

CMD

Instrukce CMD nastaví výchozí příkaz, který se má spustit při nasazování instance image kontejneru. Pokud například kontejner hostuje webový server NGINX, může CMD obsahovat pokyny ke spuštění webového serveru pomocí příkazu, jako je nginx.exe. Pokud je v souboru Dockerfile zadáno více CMD instrukcí, vyhodnotí se pouze poslední.

Formát instrukce CMD vypadá takto:

# exec form

CMD ["<executable", "<param>"]

# shell form

CMD <command>

Důležité informace o používání cmd ve Windows

Ve Windowsu musí cesty k souborům zadané v instrukci CMD používat lomítka nebo mít uniknutá zpětná lomítka \\. Zde jsou platné pokyny CMD.

# exec form

CMD ["c:\\Apache24\\bin\\httpd.exe", "-w"]

# shell form

CMD c:\\Apache24\\bin\\httpd.exe -w

Následující formát bez správných lomítek však nebude fungovat:

CMD c:\Apache24\bin\httpd.exe -w

Podrobnější informace o instrukci CMD naleznete v referenční příručce CMD.

Escape znak

V mnoha případech bude potřeba instrukci souboru Dockerfile přesahovat více řádků. K tomu můžete použít escape sekvenci. Výchozí řídicí znak souboru Dockerfile je zpětné lomítko \. Vzhledem k tomu, že zpětné lomítko je také oddělovačem cesty k souboru ve Windows, může jeho použití k rozdělení na více řádků způsobit problémy. K tomu můžete použít direktivu parseru ke změně výchozího escape znaku. Další informace o direktivách analyzátoru viz direktivy analyzátoru.

Následující příklad ukazuje jeden příkaz RUN, který zahrnuje více řádků s použitím výchozího únikového znaku:

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

Chcete-li upravit escape znak, umístěte direktivu parseru pro escape znak na první řádek souboru Dockerfile. To je vidět v následujícím příkladu.

Poznámka

Jako escape znaky lze použít pouze dvě hodnoty: \ a `.

# 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

Další informace o direktivě řídicího analyzátoru naleznete v tématu Direktiva řídicího analyzátoru.

PowerShell v souboru Dockerfile

Příkazy cmdlet PowerShellu

Rutiny PowerShellu je možné spouštět v souboru Dockerfile pomocí operace RUN.

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath c:\

Volání REST

Cmdlet Invoke-WebRequest PowerShellu může být užitečný při shromažďování informací nebo souborů z webové služby. Pokud například vytvoříte image, která obsahuje Python, můžete nastavit $ProgressPreference na SilentlyContinue, abyste dosáhli rychlejšího stahování, jak je znázorněno v následujícím příkladu.

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

Poznámka

Invoke-WebRequest funguje také na Nano Serveru.

Další možností použití PowerShellu ke stažení souborů během procesu vytváření image je použití knihovny .NET WebClient. To může zvýšit výkon stahování. Následující příklad stáhne software Pythonu pomocí knihovny WebClient.

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

Poznámka

Nano Server v současné době nepodporuje WebClient.

Skripty PowerShellu

V některých případech může být užitečné zkopírovat skript do kontejnerů, které používáte při vytváření image, a pak skript spustit z kontejneru.

Poznámka

Tím omezíte ukládání do mezipaměti vrstvy image a snížíte čitelnost souboru Dockerfile.

Tento příklad zkopíruje skript z počítače sestavení do kontejneru pomocí instrukce ADD. Tento skript se pak spustí pomocí instrukce SPUSTIT.

FROM mcr.microsoft.com/windows/servercore:ltsc2019
ADD script.ps1 /windows/temp/script.ps1
RUN powershell.exe -executionpolicy bypass c:\windows\temp\script.ps1

Sestavení Dockeru

Po vytvoření a uložení souboru Dockerfile na disk můžete spustit docker build a vytvořit novou image. Příkaz docker build přebírá několik volitelných parametrů a cestu k souboru Dockerfile. Kompletní dokumentaci k Docker Buildu, včetně seznamu všech možností sestavení, najdete v referenční dokumentaci sestavení.

Formát příkazu docker build vypadá takto:

docker build [OPTIONS] PATH

Například následující příkaz vytvoří image s názvem iis.

docker build -t iis .

Po zahájení procesu sestavení bude výstup indikovat stav a vracet všechny vyvolané chyby.

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

Výsledkem je nová image kontejneru, která v tomto příkladu má název 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

Další čtení a odkazy