Dockerfile в Windows

Подсистема Docker содержит средства, автоматизирующие создание образов контейнеров. Хотя образы контейнеров можно создавать вручную с помощью команды docker commit, внедрение процесса автоматического создания образа предоставляет множество преимуществ, в том числе:

  • Сохранение образов контейнеров в виде кода.
  • Быстрое и точное воссоздание образов контейнеров для обслуживания и обновления.
  • Непрерывная интеграция между образами контейнеров и циклом разработки.

За такую автоматизацию отвечают два компонента Docker — файл Dockerfile и команда docker build.

Dockerfile — это текстовый файл с инструкциями, необходимыми для создания образа контейнера. Эти инструкции включают идентификацию существующего образа, используемого в качестве основы, команды, выполняемые в процессе создания образа, и команду, которая будет выполняться при развертывании новых экземпляров этого образа контейнера.

Docker build — команда подсистемы Docker, использующая файл Dockerfile и запускающая процесс создания образа.

В этом разделе рассказывается о том, как использовать файлы Dockerfile с контейнерами Windows, а также объясняются наиболее распространенные инструкции и базовый синтаксис таких файлов.

Здесь также рассматривается концепция образов контейнеров и их слоев. Дополнительные сведения об образах и их слоях см. в документации по базовым образам контейнеров.

Полный обзор файлов Dockerfile см. в справке по Dockerfile на странице .

Базовый синтаксис

В исходной форме файл Dockerfile может быть очень простым. Следующий пример создает образ, включающий IIS и сайт "hello world". Этот пример включает комментарии (обозначенные с помощью #), поясняющие каждый шаг. В последующих разделах этой статьи более подробно рассматриваются правила синтаксиса Dockerfile и инструкции Dockerfile.

Примечание

Файл Dockerfile необходимо создавать без расширения. Чтобы сделать это в Windows, создайте файл с помощью удобного для вас редактора, а затем сохраните его, используя нотацию "Dockerfile" (вместе с кавычками).

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

Дополнительные примеры файлов Dockerfile для Windows см. в репозитории файлов Dockerfile для Windows.

Instructions

Инструкции Dockerfile дают подсистеме Docker необходимые указания для создания образа контейнера. Эти инструкции выполняются по очереди, одна за другой. Ниже приведены примеры наиболее часто используемых инструкций в файлах Dockerfile. Полный список инструкций Dockerfile см. в справочнике по файлам Dockerfile.

FROM

Инструкция FROM задает образ контейнера, который будет применяться при создании нового образа. Например, при использовании инструкции FROM mcr.microsoft.com/windows/servercore полученный образ является производным и зависимым от базового образа ОС Windows Server Core. Если указанный образ отсутствует в системе, где выполняется процесс сборки Docker, подсистема Docker попытается скачать его из общедоступного или частного реестра образов.

Формат инструкции FROM выглядит следующим образом:

FROM <image>

Ниже приведен пример команды FROM.

Чтобы загрузить Windows Server Core версии ltsc2019 из Реестра контейнеров (Майкрософт):

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

Дополнительные сведения см. в справочнике по инструкции FROM.

ВЫПОЛНИТЬ

Инструкция RUN задает команды, которые следует выполнить и поместить в новый образ контейнера. Эти команды могут включать такие элементы, как установка программного обеспечения, создание файлов и папок, а также создание конфигурации среды.

Инструкция RUN выглядит следующим образом:

# exec form

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

# shell form

RUN <command>

Различие между формой исполняемого файла (exec form) и формой оболочки (shell form) заключается в способе выполнения инструкции RUN. При использовании формы исполняемого файла указанная программа запускается явным образом.

Ниже приведен пример формы исполняемого файла.

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

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

Полученный образ выполняет команду 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

В отличие от предыдущего примера здесь та же операция выполняется с использованием формы оболочки:

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

RUN powershell New-Item c:\test

Полученный образ содержит инструкцию RUN 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

Рекомендации по использованию инструкции RUN с Windows

В Windows при использовании инструкции RUN в формате исполняемого файла необходимо экранировать инструкции символы обратной косой черты.

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

Если целевая программа является установщиком Windows, чтобы запустить фактическую процедуру (автоматической) установки, необходимо извлечь программу установки, используя флаг /x:<directory>. Прежде чем выполнять какие-либо другие действия, необходимо дождаться завершения выполнения команды. В противном случае процесс будет завершен преждевременно и без установки. Дополнительные сведения см. в приведенном ниже примере.

Примеры использования инструкции RUN с Windows

В следующем примере для установки служб IIS в образе контейнера используется система DISM.

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

Этот пример устанавливает распространяемый пакет Visual Studio. Start-Process и параметр -Wait используются для запуска программы установки. Это гарантирует, что установка будет завершена до перехода к следующей инструкции в Dockerfile.

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

Подробные сведения об инструкции RUN см. в справочнике по RUN на странице .

КОПИРОВАТЬ

Инструкция COPY копирует файлы и каталоги в файловую систему контейнера. Эти файлы и каталоги должны иметь путь, являющийся относительным для Dockerfile.

Формат инструкции COPY выглядит следующим образом:

COPY <source> <destination>

Если источник или назначение содержит пробел, заключите путь в квадратные скобки и двойные кавычки, как показано в следующем примере:

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

Рекомендации по использованию инструкции COPY с Windows

В Windows для путей назначения необходимо использовать символы косой черты. Например, здесь показаны допустимые инструкции COPY.

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

При этом следующий формат с обратными косыми чертами работать не будет:

COPY test1.txt c:\temp\

Примеры использования инструкции COPY с Windows

В следующем примере содержимое исходного каталога добавляется в каталог с именем sqllite в образе контейнера.

COPY source /sqlite/

В следующем примере все файлы, начинающиеся с config, добавляют в каталог c:\temp образа контейнера.

COPY config* c:/temp/

Дополнительные сведения об инструкции COPY см. в справочнике по инструкции COPY.

ADD

Инструкция ADD похожа на инструкцию COPY, но с дополнительными возможностями. Кроме копирования файлов с узла в образ контейнера, инструкция ADD также позволяет скопировать файлы из удаленного расположения с помощью задания URL-адреса.

Формат инструкции ADD выглядит следующим образом:

ADD <source> <destination>

Если источник или назначение содержит пробел, заключите путь в квадратные скобки и двойные кавычки.

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

Рекомендации по выполнению инструкции ADD с Windows

В Windows для путей назначения необходимо использовать символы косой черты. Например, здесь показаны допустимые инструкции ADD.

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

При этом следующий формат с обратными косыми чертами работать не будет:

ADD test1.txt c:\temp\

Кроме того, в системе Linux во время копирования инструкция ADD распаковывает сжатые пакеты. В Windows эта функция недоступна.

Примеры использования инструкции ADD с Windows

В следующем примере содержимое исходного каталога добавляется в каталог с именем sqllite в образе контейнера.

ADD source /sqlite/

В следующем примере все файлы, начинающиеся с "config", добавляют в каталог c:\temp образа контейнера.

ADD config* c:/temp/

В этом примере Python для Windows скачивается в каталог c:\temp образа контейнера.

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

Дополнительные сведения об инструкции ADD см. в справочнике по инструкции ADD.

WORKDIR

Инструкция WORKDIR задает рабочий каталог для других инструкций Dockerfile, например RUN и CMD, а также рабочий каталог для запущенных экземпляров образа контейнера.

Формат инструкции WORKDIR выглядит следующим образом:

WORKDIR <path to working directory>

Рекомендации по использованию инструкции WORKDIR с Windows

Если в Windows рабочий каталог содержит обратную косую черту, ее следует экранировать.

WORKDIR c:\\windows

Примеры

WORKDIR c:\\Apache24\\bin

Подробные сведения об инструкции WORKDIR см. в справочнике по WORKDIR.

CMD

Инструкция CMD задает команду по умолчанию, выполняемую при развертывании экземпляра образа контейнера. Например, если в контейнере будет размещен веб-сервер NGINX, CMD может включать инструкции для запуска этого веб-сервера, например с помощью команды nginx.exe. Если в файле Dockerfile указано несколько инструкций CMD, вычисляется только последняя из них.

Формат инструкции CMD выглядит следующим образом:

# exec form

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

# shell form

CMD <command>

Рекомендации по использованию инструкции CMD с Windows

В Windows для путей к файлам, указанным в инструкции CMD, следует использовать символы косой черты или экранировать символы обратной косой черты \\. Допустимы следующие инструкции CMD:

# exec form

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

# shell form

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

Однако следующий формат без соответствующих косых черт работать не будет:

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

Дополнительные сведения об инструкции CMD см. в справочнике по инструкции CMD.

Escape-символ

Во многих случаях инструкция Dockerfile должна занимать несколько строк. Для этого можно использовать escape-символ. Escape-символ Dockerfile по умолчанию — обратная косая черта (\). Однако, поскольку обратная косая черта также является разделителем пути к файлу в Windows, использование его для разделения нескольких строк может вызвать проблемы. Чтобы их избежать, можно изменить escape-символ по умолчанию с помощью директивы анализатора. Дополнительные сведения о директивах анализатора см. в этом разделе.

В следующем примере показана инструкция RUN, которая занимает несколько строк и использует 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

Чтобы изменить escape-символ, поместите директиву Parser для escape-символа на первую строку Dockerfile. Это показано в следующем примере.

Примечание

В качестве escape-символов можно использовать только символы: \ и `.

# 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

Дополнительные сведения о директиве анализатора для escape-символа см. в этом разделе.

PowerShell в Dockerfile

Командлеты PowerShell

Командлеты PowerShell можно выполнять в Dockerfile при помощи операции RUN.

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

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

Вызовы REST

При сборе данных или файлов из веб-службы удобно использовать командлет PowerShell Invoke-WebRequest. Например, при сборке образа, включающего Python, можно задать для $ProgressPreference значение SilentlyContinue, чтобы ускорить загрузку, как показано в следующем примере.

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

Примечание

Invoke-WebRequest также работает на сервере Nano Server.

Кроме того, при помощи PowerShell можно скачивать файлы во время создания образа, используя библиотеку .NET WebClient. Это может повысить производительность скачивания. Следующий пример скачивает программное обеспечение Python, используя библиотеку 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

Примечание

Сейчас Nano Server не поддерживает WebClient.

Сценарии PowerShell

В некоторых случаях удобно скопировать крипт в контейнеры, используемые при создании образа, и затем запустить его из контейнера.

Примечание

Это ограничивает возможности кэширования слоев образов, а также ухудшает удобочитаемость файла Dockerfile.

Этот пример копирует сценарий с компьютера сборки в контейнер с помощью инструкции ADD. Затем этот сценарий выполняется с помощью инструкции 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

Команда Docker build

После создания файла Dockerfile и сохранения его на диск можно запустить docker build для создания нового образа. Команда docker build принимает несколько необязательных параметров и путь к файлу Dockerfile. Полную документацию по команде Docker build, включая список всех параметров сборки, см. в справочнике по сборке.

Формат команды docker build выглядит следующим образом:

docker build [OPTIONS] PATH

Например, следующая команда создает образ с именем "iis".

docker build -t iis .

При инициации процесса сборки в выходных данных указывается состояние и выводятся все возникающие ошибки.

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

В результате создается новый образ контейнера, который в этом примере носит имя "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

Дополнительные материалы и справочники