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/servercore
je 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
, CMD
a 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