Docker 引擎包含用於自動建立容器映像的工具。 儘管可使用 docker commit
命令手動建立容器映像,然而採用自動映像建立過程可得到許多好處,其中包括:html
驅動實現這一自動化過程的 Docker 組件是 Dockerfile,以及 docker build
命令。python
本文檔將介紹將 Dockerfile 用於 Windows 容器的相關內容、討論語法並詳細介紹經常使用的 Dockerfile 指令。nginx
本文檔將通篇討論容器映像和容器映像層的概念。 有關映像和映像分層的詳細信息,請參閱git
。有關 Dockerfile 的完整詳細信息,請參閱 github
。Dockerfile 的最基本形式十分簡單。 下面的示例建立了一個新映像,其中包括 IIS 和一個「hello world」站點。 此示例包含了用於解釋每一個步驟的註釋(經過 #
指示)。 本文的後續部分將對 Dockerfile 語法規則和 Dockerfile 指令進行更詳細的講解。web
請注意,建立的 Dockerfile 不得帶擴展名。 要在 Windows 中作到這一點,只需使用所選編輯器建立該文件便可,而不是使用「Dockerfile」符號(包括引號)保存。redis
# Sample Dockerfile
# Indicates that the windowsservercore image will be used as the base image.
FROM microsoft/windowsservercore
# Metadata indicating an image maintainer.
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" ]
有關用於 Windows 的 Dockerfile 的其餘示例,請參閱sql
。Dockerfile 指令爲 Docker 引擎提供建立容器映像所需的步驟。 這些指令按順序逐一執行。 如下是有關一些基本 Dockerfile 指令的詳細信息。 有關 Dockerfile 指令的完整列表,請參閱 docker
。FROM
指令用於設置在新映像建立過程期間將使用的容器映像。 例如,使用指令 FROM microsoft/windowsservercore
時,所獲得的映像派生自 Windows Server Core 基本操做系統映像映像並具備對其的依賴關係。 若是正在進行 Docker 生成過程的系統上不存在指定的映像,Docker 引擎將嘗試從公有或私有映像註冊表下載該映像。shell
格式
FROM 指令所採用的格式爲:
FROM <image>
示例
FROM microsoft/windowsservercore
有關 FROM 指令的詳細信息,請參閱
。RUN
指令指定將要運行並捕獲到新容器映像中的命令。 這些命令包括安裝軟件、建立文件和目錄,以及建立環境配置等。
格式
RUN 指令所採用的格式爲:
# exec form
RUN ["<executable", "<param 1>", "<param 2>"]
# shell form
RUN <command>
Exec 與 Shell 窗體之間的區別在於 RUN
指令執行的方式。 使用 exec 窗體時,指定的程序顯式運行。
如下示例使用了 exec 窗體。
FROM microsoft/windowsservercore
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
爲進行比較,下面的示例運行相同的操做,但使用的是 shell 窗體。
FROM microsoft/windowsservercore
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
Windows 注意事項
在 Windows 上,使用具備 exec 格式的 RUN
指令時,反斜槓必須進行轉義。
RUN ["powershell", "New-Item", "c:\\test"]
當目標程序是 Windows Installer 時,在啓動實際(無提示)安裝過程以前須要執行一個額外步驟:經過 /x:<directory>
標誌,提取安裝程序。 此外,須要等待此命令退出。 不然,安裝過程將在未安裝任何內容的狀況下提早結束。 有關詳細信息,請參閱如下示例。
示例
此示例使用 DISM 在容器映像中安裝 IIS。
RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart
此示例安裝 Visual Studio 可再發行組件包。 請注意,Start-Process
和 -Wait
參數用於運行安裝程序。 以確保在完成安裝後再移動到 Dockerfile 中的第二步。
RUN Start-Process c:\vcredist_x86.exe -ArgumentList '/quiet' -Wait
有關 RUN 指令的詳細信息,請參閱
。COPY
指令將文件和目錄複製到容器的文件系統。 文件和目錄需位於相對於 Dockerfile 的路徑中。
格式
COPY
指令所採用的格式爲:
COPY <source> <destination>
若是源或目標包含空格,請將路徑括在方括號和雙引號中。
COPY ["<source>", "<destination>"]
Windows 注意事項
在 Windows 上,目標格式必須使用正斜槓。 例如,如下是有效的 COPY
指令。
COPY test1.txt /temp/ COPY test1.txt c:/temp/
可是,如下指令不起做用。
COPY test1.txt c:\temp\
示例
此示例將源目錄的內容添加到容器映像中一個名爲 sqllite
的目錄。
COPY source /sqlite/
此示例會將以 config 開頭的全部文件添加到容器映像的 c:\temp
目錄中。
COPY config* c:/temp/
有關 COPY
指令的詳細信息,請參閱 (Docker.com上的 COPY 參考)。
ADD 指令與 COPY 指令很是相似;但它包含更多功能。 除了將文件從主機複製到容器映像,ADD
指令還可使用 URL 規範從遠程位置複製文件。
格式
ADD
指令所採用的格式爲:
ADD <source> <destination>
若是源或目標包含空格,請將路徑括在方括號和雙引號中。
ADD ["<source>", "<destination>"]
Windows 注意事項
在 Windows 上,目標格式必須使用正斜槓。 例如,這些是有效的 ADD
指令。
ADD test1.txt /temp/ ADD test1.txt c:/temp/
可是,如下指令不起做用。
ADD test1.txt c:\temp\
此外,在 Linux 上 ADD
指令將在複製時展開壓縮包。 此功能在 Windows 中不可用。
示例
此示例將源目錄的內容添加到容器映像中一個名爲 sqllite
的目錄。
ADD source /sqlite/
此示例會將以 config 開頭的全部文件添加到容器映像的 c:\temp
目錄中。
ADD config* c:/temp/
此示例會將 Python for 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
指令的詳細信息,請參閱 。
WORKDIR
指令用於爲其餘 Dockerfile 指令(如 RUN
、CMD
)設置一個工做目錄,而且還設置用於運行容器映像實例的工做目錄。
格式
WORKDIR
指令所採用的格式爲:
WORKDIR <path to working directory>
Windows 注意事項
在 Windows 上,若是工做目錄包含一個反斜槓,則必須對其進行轉義。
WORKDIR c:\\windows
示例
WORKDIR c:\\Apache24\\bin
有關 WORKDIR
指令的詳細信息,請參閱 。
CMD
指令用於設置部署容器映像的實例時要運行的默認命令。 例如,若是該容器將承載 NGINX Web 服務器,則 CMD
可能包括用於啓動 Web 服務器的指令,如 nginx.exe
。 若是 Dockerfile 中指定了多個 CMD
指令,只會計算最後一個指令。
格式
CMD
指令所採用的格式爲:
# exec form
CMD ["<executable", "<param>"]
# shell form
CMD <command>
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
指令的詳細信息,請參閱 。
在許多狀況下,Dockerfile 指令須要跨多個行;這可經過轉義字符完成。 默認 Dockerfile 轉義字符是反斜槓 \
。 因爲反斜槓在 Windows 中也是一個文件路徑分隔符,這可能致使出現問題。 要更改默認轉義字符,可以使用一個分析程序指令。 有關分析程序指令的詳細信息,請參閱 (Docker.com 上的分析程序指令)。
如下示例顯示使用默認轉義字符跨多個行的單個 RUN 指令。
FROM microsoft/windowsservercore
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
要修改轉義字符,請在 Dockerfile 最開始的行上放置一個轉義分析程序指令。 如如下示例所示。
請注意,只有兩個值可用做轉義字符:
\
和`
。
# escape=`
FROM microsoft/windowsservercore
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
有關轉義分析程序指令的詳細信息,請參閱
(Docker.com 上的轉義分析程序指令)。可以使用 RUN
操做在 Dockerfile 中運行 PowerShell 命令。
FROM microsoft/windowsservercore
RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath c:\
當從 Web 服務收集信息或文件時,PowerShell 與 Invoke-WebRequest
命令會頗有用。 例如,若是要構建包括 Python 的映像,可使用下面的示例。 請考慮將 $ProgressPreference
設置爲 SilentlyContinue
,從而實現更快的下載速度。
FROM microsoft/windowsservercore
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
在映像建立過程期間,還能夠經過 .NET WebClient 庫使用 PowerShell 下載文件。 這能夠增長下載性能。 下面的示例使用 WebClient 庫下載 Python 軟件。
FROM microsoft/windowsservercore
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
在某些狀況下,執行這樣的操做可能會有所幫助:將腳本複製到映像建立過程期間使用的容器中,而後從該容器內運行腳本。 請注意 - 這會限制任何映像層緩存,並下降 Dockerfile 的可讀性。
此示例使用 ADD
指令將腳本從生成計算機複製到容器中。 而後,此腳本使用 RUN 指令運行。
FROM microsoft/windowsservercore ADD script.ps1 /windows/temp/script.ps1 RUN powershell.exe -executionpolicy bypass c:\windows\temp\script.ps1
建立 Dockerfile 並將其保存到磁盤後,便可運行 docker build
以建立新映像。 docker build
命令採用幾個可選參數和指向 Dockerfile 的路徑。 有關 Docker Build 的完整文檔,包括全部生成選項的列表,請參閱 (Docker.com 上的 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 micrsoft/windowsservercore
---> 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