Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подсистема 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="[email protected]"
# 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