windows 2016 dockerfile 以及簡單使用

 Docker 引擎包含用於自動建立容器映像的工具。 儘管可使用 docker commit 命令手動建立容器映像,然而採用自動映像建立過程可得到許多好處,其中包括:html

  • 將容器映像存儲爲代碼。
  • 可出於維護和升級的目的快速而精確地從新建立容器映像。
  • 容器映像和開發週期之間的持續集成。

驅動實現這一自動化過程的 Docker 組件是 Dockerfile,以及 docker build 命令。python

  • Dockerfile - 一個文本文件,包含建立新容器映像所需的指令。 這些指令包括對將用做基礎的現有映像的標識、將在映像建立過程當中運行的命令以及部署容器映像的新實例時將要運行的命令。
  • Docker build - 使用 Dockerfile 並觸發映像建立過程的 Docker 引擎命令。

本文檔將介紹將 Dockerfile 用於 Windows 容器的相關內容、討論語法並詳細介紹經常使用的 Dockerfile 指令。nginx

本文檔將通篇討論容器映像和容器映像層的概念。 有關映像和映像分層的詳細信息,請參閱映像快速入門指南git

有關 Dockerfile 的完整詳細信息,請參閱 docker.com 上的 Dockerfile 參考github

Dockerfile 指令

基本語法

Dockerfile 的最基本形式十分簡單。 下面的示例建立了一個新映像,其中包括 IIS 和一個「hello world」站點。 此示例包含了用於解釋每一個步驟的註釋(經過 # 指示)。 本文的後續部分將對 Dockerfile 語法規則和 Dockerfile 指令進行更詳細的講解。web

請注意,建立的 Dockerfile 不得帶擴展名。 要在 Windows 中作到這一點,只需使用所選編輯器建立該文件便可,而不是使用「Dockerfile」符號(包括引號)保存。redis

Copy
none
# 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 的其餘示例,請參閱用於 Windows 的 Dockerfile 存儲庫sql

說明

Dockerfile 指令爲 Docker 引擎提供建立容器映像所需的步驟。 這些指令按順序逐一執行。 如下是有關一些基本 Dockerfile 指令的詳細信息。 有關 Dockerfile 指令的完整列表,請參閱 Docker.com 上的 Dockerfile 參考docker

FROM

FROM 指令用於設置在新映像建立過程期間將使用的容器映像。 例如,使用指令 FROM microsoft/windowsservercore 時,所獲得的映像派生自 Windows Server Core 基本操做系統映像映像並具備對其的依賴關係。 若是正在進行 Docker 生成過程的系統上不存在指定的映像,Docker 引擎將嘗試從公有或私有映像註冊表下載該映像。shell

格式

FROM 指令所採用的格式爲:

Copy
 
FROM <image>

示例

Copy
 
FROM microsoft/windowsservercore

有關 FROM 指令的詳細信息,請參閱 Docker.com 上的 FROM 參考

RUN

RUN 指令指定將要運行並捕獲到新容器映像中的命令。 這些命令包括安裝軟件、建立文件和目錄,以及建立環境配置等。

格式

RUN 指令所採用的格式爲:

Copy
none
# exec form

RUN ["<executable", "<param 1>", "<param 2>"] 
# shell form

RUN <command> 

Exec 與 Shell 窗體之間的區別在於 RUN 指令執行的方式。 使用 exec 窗體時,指定的程序顯式運行。

如下示例使用了 exec 窗體。

Copy
none
FROM microsoft/windowsservercore

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

檢查生成的映像,所運行的命令是 powershell New-Item c:/test

Copy
none
docker history doc-exe-method IMAGE CREATED CREATED BY SIZE COMMENT b3452b13e472 2 minutes ago powershell New-Item c:/test   30.76 MB

爲進行比較,下面的示例運行相同的操做,但使用的是 shell 窗體。

Copy
none
FROM microsoft/windowsservercore

RUN powershell New-Item c:\test 

這將致使運行指令 cmd /S /C powershell New-Item c:\test

Copy
none
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 指令時,反斜槓必須進行轉義。

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

當目標程序是 Windows Installer 時,在啓動實際(無提示)安裝過程以前須要執行一個額外步驟:經過 /x:<directory> 標誌,提取安裝程序。 此外,須要等待此命令退出。 不然,安裝過程將在未安裝任何內容的狀況下提早結束。 有關詳細信息,請參閱如下示例。

示例

此示例使用 DISM 在容器映像中安裝 IIS。

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

此示例安裝 Visual Studio 可再發行組件包。 請注意,Start-Process 和 -Wait 參數用於運行安裝程序。 以確保在完成安裝後再移動到 Dockerfile 中的第二步。

Copy
none
RUN Start-Process c:\vcredist_x86.exe -ArgumentList '/quiet' -Wait 

有關 RUN 指令的詳細信息,請參閱 Docker.com 上的 RUN 參考

複製

COPY 指令將文件和目錄複製到容器的文件系統。 文件和目錄需位於相對於 Dockerfile 的路徑中。

格式

COPY 指令所採用的格式爲:

Copy
none
COPY <source> <destination> 

若是源或目標包含空格,請將路徑括在方括號和雙引號中。

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

Windows 注意事項

在 Windows 上,目標格式必須使用正斜槓。 例如,如下是有效的 COPY 指令。

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

可是,如下指令不起做用。

Copy
none
COPY test1.txt c:\temp\ 

示例

此示例將源目錄的內容添加到容器映像中一個名爲 sqllite 的目錄。

Copy
none
COPY source /sqlite/ 

此示例會將以 config 開頭的全部文件添加到容器映像的 c:\temp 目錄中。

Copy
none
COPY config* c:/temp/ 

有關 COPY 指令的詳細信息,請參閱 COPY Reference on Docker.com(Docker.com上的 COPY 參考)。

添加

ADD 指令與 COPY 指令很是相似;但它包含更多功能。 除了將文件從主機複製到容器映像,ADD指令還可使用 URL 規範從遠程位置複製文件。

格式

ADD 指令所採用的格式爲:

Copy
none
ADD <source> <destination> 

若是源或目標包含空格,請將路徑括在方括號和雙引號中。

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

Windows 注意事項

在 Windows 上,目標格式必須使用正斜槓。 例如,這些是有效的 ADD 指令。

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

可是,如下指令不起做用。

Copy
none
ADD test1.txt c:\temp\ 

此外,在 Linux 上 ADD 指令將在複製時展開壓縮包。 此功能在 Windows 中不可用。

示例

此示例將源目錄的內容添加到容器映像中一個名爲 sqllite 的目錄。

Copy
none
ADD source /sqlite/ 

此示例會將以 config 開頭的全部文件添加到容器映像的 c:\temp 目錄中。

Copy
none
ADD config* c:/temp/ 

此示例會將 Python for Windows下載到容器映像的 c:\temp 目錄。

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

有關 ADD 指令的詳細信息,請參閱 Docker.com 上的 ADD 參考

WORKDIR

WORKDIR 指令用於爲其餘 Dockerfile 指令(如 RUNCMD)設置一個工做目錄,而且還設置用於運行容器映像實例的工做目錄。

格式

WORKDIR 指令所採用的格式爲:

Copy
none
WORKDIR <path to working directory> 

Windows 注意事項

在 Windows 上,若是工做目錄包含一個反斜槓,則必須對其進行轉義。

Copy
none
WORKDIR c:\\windows 

示例

Copy
none
WORKDIR c:\\Apache24\\bin 

有關 WORKDIR 指令的詳細信息,請參閱 Docker.com 上的 WORKDIR 參考

CMD

CMD 指令用於設置部署容器映像的實例時要運行的默認命令。 例如,若是該容器將承載 NGINX Web 服務器,則 CMD 可能包括用於啓動 Web 服務器的指令,如 nginx.exe。 若是 Dockerfile 中指定了多個 CMD 指令,只會計算最後一個指令。

格式

CMD 指令所採用的格式爲:

Copy
none
# exec form

CMD ["<executable", "<param>"] 
# shell form

CMD <command> 

Windows 注意事項

在 Windows 上,在 CMD 指令中指定的文件路徑必須使用正斜槓或已轉義的反斜槓 \\。 例如,這些是有效的 CMD 指令。

Copy
none
# exec form

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

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

可是,如下指令不起做用。

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

有關 CMD 指令的詳細信息,請參閱 Docker.com 上的 CMD 參考

轉義字符

在許多狀況下,Dockerfile 指令須要跨多個行;這可經過轉義字符完成。 默認 Dockerfile 轉義字符是反斜槓 \。 因爲反斜槓在 Windows 中也是一個文件路徑分隔符,這可能致使出現問題。 要更改默認轉義字符,可以使用一個分析程序指令。 有關分析程序指令的詳細信息,請參閱 Parser Directives on Docker.com(Docker.com 上的分析程序指令)。

如下示例顯示使用默認轉義字符跨多個行的單個 RUN 指令。

Copy
none
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 最開始的行上放置一個轉義分析程序指令。 如如下示例所示。

請注意,只有兩個值可用做轉義字符:\ 和 `

Copy
none
# 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

有關轉義分析程序指令的詳細信息,請參閱 Escape Parser Directive on Docker.com(Docker.com 上的轉義分析程序指令)。

Dockerfile 中的 PowerShell

PowerShell 命令

可以使用 RUN 操做在 Dockerfile 中運行 PowerShell 命令。

Copy
none
FROM microsoft/windowsservercore

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

REST 調用

當從 Web 服務收集信息或文件時,PowerShell 與 Invoke-WebRequest 命令會頗有用。 例如,若是要構建包括 Python 的映像,可使用下面的示例。 請考慮將 $ProgressPreference 設置爲 SilentlyContinue,從而實現更快的下載速度。

Copy
none
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 軟件。

Copy
none
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

PowerShell 腳本

在某些狀況下,執行這樣的操做可能會有所幫助:將腳本複製到映像建立過程期間使用的容器中,而後從該容器內運行腳本。 請注意 - 這會限制任何映像層緩存,並下降 Dockerfile 的可讀性。

此示例使用 ADD 指令將腳本從生成計算機複製到容器中。 而後,此腳本使用 RUN 指令運行。

Copy
 
FROM microsoft/windowsservercore
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 的完整文檔,包括全部生成選項的列表,請參閱 build Reference on Docker.com(Docker.com 上的 Build 參考)。

Copy
none
Docker build [OPTIONS] PATH

例如,如下命令將建立名爲「iis」的映像。

Copy
none
docker build -t iis .

生成過程啓動後,輸出將指示狀態,並返回任何引起的錯誤。

Copy
none
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」。

Copy
none
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
 



相關文章
相關標籤/搜索