Udostępnij za pośrednictwem


Plik Dockerfile w systemie operacyjnym Windows

Silnik Docker zawiera narzędzia automatyzujące tworzenie obrazów kontenerów. Chociaż obrazy kontenerów można tworzyć ręcznie, uruchamiając polecenie docker commit, wdrożenie zautomatyzowanego procesu tworzenia obrazów ma wiele korzyści, w tym:

  • Przechowywanie obrazów kontenerów jako kodu.
  • Szybkie i precyzyjne odtworzenie obrazów kontenerów na potrzeby konserwacji i uaktualniania.
  • Ciągła integracja między obrazami kontenerów a cyklem projektowania.

Składniki platformy Docker, które napędzają tę automatyzację, są plikiem Dockerfile i poleceniem docker build.

Plik Dockerfile to plik tekstowy zawierający instrukcje potrzebne do utworzenia nowego obrazu kontenera. Te instrukcje obejmują identyfikację istniejącego obrazu, który ma być używany jako podstawa, polecenia do uruchomienia podczas procesu tworzenia obrazu oraz polecenie, które zostanie uruchomione po wdrożeniu nowych wystąpień obrazu kontenera.

Docker build to polecenie silnika Docker, które używa pliku Dockerfile i wyzwala proces tworzenia obrazu.

W tym temacie pokazano, jak używać plików Dockerfile z kontenerami systemu Windows, poznać ich podstawową składnię i jak poznać najbardziej typowe instrukcje dotyczące pliku Dockerfile.

W tym dokumencie omówiono koncepcję obrazów kontenerów i warstw obrazów kontenera. Jeśli chcesz dowiedzieć się więcej na temat obrazów i nakładania warstw, zobacz podstawowe obrazy kontenera.

Aby uzyskać pełne informacje na temat plików Dockerfile, zobacz dokumentację Dockerfile.

Podstawowa składnia

W najbardziej podstawowej formie plik Dockerfile może być bardzo prosty. Poniższy przykład tworzy nowy obraz, który obejmuje usługi IIS i witrynę "hello world". Ten przykład zawiera komentarze (oznaczone #), które wyjaśniają każdy krok. W kolejnych sekcjach tego artykułu bardziej szczegółowo opisano reguły składni pliku Dockerfile i instrukcje dotyczące pliku Dockerfile.

Notatka

Plik Dockerfile musi zostać utworzony bez rozszerzenia. Aby to zrobić w systemie Windows, utwórz plik z wybranym edytorem, a następnie zapisz go w notacji "Dockerfile" (w tym cudzysłowy).

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

Aby uzyskać dodatkowe przykłady plików Dockerfile dla systemu Windows, zobacz Dockerfile for Windows repository.

Instrukcje

Instrukcje w pliku Dockerfile dostarczają silnikowi Docker poleceń potrzebnych do utworzenia obrazu kontenera. Te instrukcje są wykonywane pojedynczo i w kolejności. Poniższe przykłady to najczęściej używane instrukcje w plikach Dockerfile. Aby uzyskać pełną listę instrukcji dotyczących pliku Dockerfile, zobacz dokumentację Dockerfile.

Z

Instrukcja FROM ustawia obraz kontenera, który będzie używany podczas nowego procesu tworzenia obrazu. Na przykład podczas korzystania z instrukcji FROM mcr.microsoft.com/windows/servercorewynikowy obraz pochodzi z i ma zależność od obrazu podstawowego systemu operacyjnego Windows Server Core. Jeśli określony obraz nie jest obecny w systemie, w którym jest uruchamiany proces kompilacji platformy Docker, aparat platformy Docker podejmie próbę pobrania obrazu z rejestru obrazów publicznych lub prywatnych.

Format instrukcji FROM wygląda następująco:

FROM <image>

Oto przykład polecenia FROM:

Aby pobrać rdzeń systemu Windows Server w wersji ltsc2019 z rejestru Microsoft Container Registry (MCR):

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

Aby uzyskać bardziej szczegółowe informacje, zobacz FROM reference.

BIEGAĆ

Instrukcja RUN określa polecenia do uruchomienia, które mają być przechwycone w nowym obrazie kontenera. Te polecenia mogą obejmować elementy, takie jak instalowanie oprogramowania, tworzenie plików i katalogów oraz tworzenie konfiguracji środowiska.

Instrukcja RUN wygląda następująco:

# exec form

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

# shell form

RUN <command>

Różnica między formą exec a formą shell polega na sposobie wykonywania instrukcji RUN. W przypadku korzystania z formularza exec określony program jest uruchamiany jawnie.

Oto przykład formularza exec:

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

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

Wynikowy obraz uruchamia polecenie 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

Natomiast w poniższym przykładzie jest uruchamiana ta sama operacja w postaci powłoki:

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

RUN powershell New-Item c:\test

Wynikowy obraz zawiera instrukcję uruchamiania 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

Zagadnienia dotyczące korzystania z polecenia Uruchom w systemie Windows

W systemie Windows podczas korzystania z instrukcji RUN z formatem exec należy użyć ukośników odwrotnych.

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

Gdy program docelowy jest instalatorem systemu Windows, należy wyodrębnić konfigurację za pomocą flagi /x:<directory>, zanim będzie można uruchomić rzeczywistą (dyskretną) procedurę instalacji. Przed wykonaniem czegokolwiek innego należy również poczekać na zakończenie polecenia. W przeciwnym razie proces zakończy się przedwcześnie bez instalowania czegokolwiek. Aby uzyskać szczegółowe informacje, zapoznaj się z poniższym przykładem.

Przykłady użycia funkcji RUN z systemem Windows

W poniższym przykładzie pliku Dockerfile użyto narzędzia DISM do zainstalowania IIS w wizerunku kontenera.

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

W tym przykładzie instalowany jest pakiet redystrybucyjny programu Visual Studio. Start-Process i parametr -Wait są używane do uruchamiania instalatora. Dzięki temu instalacja zostanie ukończona przed przejściem do następnej instrukcji w pliku Dockerfile.

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

Aby uzyskać szczegółowe informacje na temat instrukcji RUN, zobacz run reference.

KOPIOWAĆ

Instrukcja COPY kopiuje pliki i katalogi do systemu plików kontenera. Pliki i katalogi muszą znajdować się w ścieżce względem pliku „Dockerfile”.

Format instrukcji COPY wygląda następująco:

COPY <source> <destination>

Jeśli źródło lub miejsce docelowe zawiera biały znak, umieść ścieżkę w nawiasach kwadratowych i podwójnych cudzysłowach, jak pokazano w poniższym przykładzie:

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

Zagadnienia dotyczące korzystania z funkcji COPY w systemie Windows

W systemie Windows format docelowy musi używać ukośników. Są to na przykład prawidłowe instrukcje COPY:

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

Tymczasem następujący format z ukośnikami odwrotnymi nie będzie działać:

COPY test1.txt c:\temp\

Przykłady użycia funkcji COPY w systemie Windows

Poniższy przykład dodaje zawartość katalogu źródłowego do katalogu o nazwie sqllite na obrazie kontenera:

COPY source /sqlite/

W poniższym przykładzie zostaną dodane wszystkie pliki rozpoczynające się od konfiguracji do katalogu c:\temp obrazu kontenera:

COPY config* c:/temp/

Aby uzyskać bardziej szczegółowe informacje na temat instrukcji COPY, zobacz COPY reference.

DODAJ

Instrukcja ADD jest podobna do instrukcji COPY, ale z jeszcze większymi możliwościami. Oprócz kopiowania plików z hosta do obrazu kontenera instrukcja ADD może również kopiować pliki z lokalizacji zdalnej ze specyfikacją adresu URL.

Format instrukcji ADD wygląda następująco:

ADD <source> <destination>

Jeśli źródło lub miejsce docelowe zawierają białe znaki, umieść ścieżkę w nawiasach kwadratowych i cudzysłowach podwójnych:

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

Zagadnienia dotyczące uruchamiania ADD z Windows

W systemie Windows format docelowy musi używać ukośników. Są to na przykład prawidłowe instrukcje ADD:

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

Tymczasem następujący format z ukośnikami odwrotnymi nie będzie działać:

ADD test1.txt c:\temp\

Ponadto w systemie Linux instrukcja ADD rozszerzy skompresowane pakiety podczas kopiowania. Ta funkcja nie jest dostępna w systemie Windows.

Przykłady użycia funkcji ADD z systemem Windows

Poniższy przykład dodaje zawartość katalogu źródłowego do katalogu o nazwie sqllite na obrazie kontenera:

ADD source /sqlite/

Poniższy przykład spowoduje dodanie wszystkich plików rozpoczynających się od "config" do katalogu c:\temp obrazu kontenera.

ADD config* c:/temp/

Poniższy przykład spowoduje pobranie języka Python dla systemu Windows do katalogu c:\temp obrazu kontenera.

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

Aby uzyskać bardziej szczegółowe informacje na temat instrukcji ADD, zobacz ADD reference.

WORKDIR

Instrukcja WORKDIR ustawia katalog roboczy dla innych instrukcji dockerfile, takich jak RUN, CMD, a także katalog roboczy do uruchamiania wystąpień obrazu kontenera.

Format instrukcji WORKDIR wygląda następująco:

WORKDIR <path to working directory>

Zagadnienia dotyczące korzystania z usługi WORKDIR z systemem Windows

W systemie Windows, jeśli katalog roboczy zawiera ukośnik odwrotny, należy go uniknąć.

WORKDIR c:\\windows

Przykłady

WORKDIR c:\\Apache24\\bin

Aby uzyskać szczegółowe informacje na temat instrukcji WORKDIR, zapoznaj się z dokumentacją WORKDIR.

CMD

Instrukcja CMD ustawia domyślne polecenie, które ma być uruchomione, gdy wdrażane jest wystąpienie obrazu kontenera. Jeśli na przykład kontener będzie hostować serwer internetowy NGINX, CMD może zawierać instrukcje uruchamiania serwera internetowego za pomocą polecenia, takiego jak nginx.exe. Jeśli w pliku Dockerfile określono wiele instrukcji CMD, zostanie oceniony tylko ostatni.

Format instrukcji CMD wygląda następująco:

# exec form

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

# shell form

CMD <command>

Zagadnienia dotyczące używania narzędzia CMD z systemem Windows

W systemie Windows ścieżki plików określone w instrukcji CMD muszą używać ukośników do przodu lub zostały uniknęły ukośników odwrotnych \\. Poniżej przedstawiono prawidłowe instrukcje CMD:

# exec form

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

# shell form

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

Jednak następujący format bez odpowiednich ukośników nie będzie działać:

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

Aby uzyskać bardziej szczegółowe informacje na temat instrukcji CMD, zobacz referencję CMD.

Znak ucieczki

W wielu przypadkach instrukcja dockerfile musi obejmować wiele wierszy. W tym celu można użyć znaku ucieczki. Domyślny znak ucieczki pliku Dockerfile to ukośnik odwrotny \. Jednak ze względu na to, że ukośnik odwrotny jest również separatorem ścieżki pliku w systemie Windows, użycie go do łamania wielu wierszy może powodować problemy. Aby obejść ten problem, możesz użyć dyrektywy analizatora, aby zmienić domyślny znak ucieczki. Aby uzyskać więcej informacji na temat dyrektyw analizatora, zobacz dyrektywy analizatora.

Poniższy przykład przedstawia pojedynczą instrukcję RUN, która obejmuje wiele wierszy przy użyciu domyślnego znaku ucieczki:

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

Aby zmodyfikować znak ucieczki, umieść dyrektywę analizatora ucieczki w pierwszym wierszu pliku Dockerfile. Można to zobaczyć w poniższym przykładzie.

Notatka

Tylko dwie wartości mogą być używane jako znaki ucieczki: \ i `.

# 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

Aby uzyskać więcej informacji na temat dyrektywy analizatora znaków specjalnych, zobacz dyrektywę analizatora znaków specjalnych.

PowerShell w Dockerfile

Cmdlety programu PowerShell

Polecenia cmdlet programu PowerShell można uruchamiać w pliku Dockerfile za pomocą operacji RUN.

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

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

Żądania REST

Polecenie cmdlet Invoke-WebRequest programu PowerShell może być przydatne podczas zbierania informacji lub plików z usługi internetowej. Jeśli na przykład utworzysz obraz zawierający język Python, możesz ustawić $ProgressPreference na SilentlyContinue, aby uzyskać szybsze pobieranie, jak pokazano w poniższym przykładzie.

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

Notatka

Invoke-WebRequest działa również w systemie Nano Server.

Inną opcją użycia programu PowerShell do pobierania plików podczas procesu tworzenia obrazu jest użycie biblioteki WebClient platformy .NET. Może to zwiększyć wydajność pobierania. Poniższy przykład pobiera oprogramowanie języka Python przy użyciu biblioteki 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

Notatka

Nano Server nie obsługuje obecnie WebClient.

Skrypty programu PowerShell

W niektórych przypadkach pomocne może być skopiowanie skryptu do kontenerów używanych podczas procesu tworzenia obrazu, a następnie uruchomienie skryptu z poziomu kontenera.

Notatka

Spowoduje to ograniczenie buforowania warstwy obrazów i zmniejszenia czytelności pliku Dockerfile.

Ten przykład kopiuje skrypt z maszyny kompilacji do kontenera przy użyciu instrukcji ADD. Ten skrypt jest następnie uruchamiany przy użyciu instrukcji RUN.

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

Kompilacja platformy Docker

Po utworzeniu i zapisaniu pliku Dockerfile na dysku można uruchomić docker build, aby utworzyć nowy obraz. Polecenie docker build przyjmuje kilka parametrów opcjonalnych i ścieżkę do pliku Dockerfile. Aby uzyskać pełną dokumentację dotyczącą kompilacji platformy Docker, w tym listę wszystkich opcji kompilacji, zobacz dokumentację kompilacji .

Format polecenia docker build wygląda następująco:

docker build [OPTIONS] PATH

Na przykład następujące polecenie spowoduje utworzenie obrazu o nazwie "iis".

docker build -t iis .

Po zainicjowaniu procesu kompilacji dane wyjściowe będą wskazywać stan i zwracać wszelkie zgłaszane błędy.

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

Wynikiem jest nowy obraz kontenera, który w tym przykładzie nosi nazwę "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

Dalsze informacje i odwołania