Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подсистема 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, можно задать $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 для скачивания файлов во время процесса создания образа является использование библиотеки 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