Поделиться через


Dockerfile в Windows

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

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

Компоненты Docker, которые управляют этой автоматизацией, являются Dockerfile и команда docker build.

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

Сборка Docker — это команда движка Docker, которая использует Dockerfile и запускает процесс создания образа.

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

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

Для получения полной информации о Dockerfiles см. справочник Dockerfile reference.

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

В самой простой форме Dockerfile может быть очень простым. В следующем примере создается новый образ, включающий Интернет-информационные службы (IIS) и сайт «привет, мир». В этом примере содержатся комментарии (указанные с #), которые объясняют каждый шаг. В последующих разделах этой статьи подробно рассматриваются правила синтаксиса 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.

Инструкции

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

ОТ

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

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

FROM <image>

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

Чтобы скачать ядро windows server версии ltsc2019 из реестра контейнеров Майкрософт (MCR):

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

Для получения более подробной информации см. в справочнике FROM.

БЕГИ

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

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

# exec form

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

# shell form

RUN <command>

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

Ниже приведен пример формы exec:

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

Итоговое изображение имеет инструкцию для запуска 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 с форматом exec необходимо экранировать обратные слеши.

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

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

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

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

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/

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

COPY config* c:/temp/

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

ДОБАВЛЯТЬ

Инструкция 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 задает команду по умолчанию, выполняемую при развертывании экземпляра образа контейнера. Например, если контейнер будет размещать веб-сервер 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-символ, поместите директиву синтаксического анализа 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-синтаксического анализа см. в директиве 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 API

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

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

После создания и сохранения файла 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

Дополнительные сведения и ссылки