Docker 引擎包含自動化容器映射建立的工具。 雖然您可以藉由執行 docker commit 命令手動建立容器映射,但採用自動化映射建立程式有許多優點,包括:

  • 將容器映像儲存為程式碼。
  • 快速、精確地為維護和升級等用途重新建立容器映像。
  • 容器映像與開發週期之間的持續整合。
  • 驅動這項自動化的 Docker 元件是 Dockerfile 和 docker build 命令。

    Dockerfile 是文字檔,其中包含建立新容器映射所需的指示。 這些指令包含將用作基底的現有映像識別碼、在映像建立程序中執行的命令,以及部署容器映像新執行個體時所執行的命令。

    Docker build 是 Docker 引擎命令,會取用 Dockerfile 並觸發映射建立程式。

    本主題將示範如何搭配 Windows 容器使用 Dockerfiles、瞭解其基本語法,以及最常見的 Dockerfile 指示是什麼。

    本檔將討論容器映射和容器映射層的概念。 如果您想要深入瞭解映射和映射分層,請參閱 容器基底映射

    如需 Dockerfiles 的完整外觀,請參閱 Dockerfile 參考

    Dockerfile 在最基本的形式中可以極度簡易。 下列範例會建立新的映像,其中包括 IIS 和 ‘hello world’ 站台。 這個範例包含會說明每個步驟的註解 (以 # 表示)。 這篇文章的後續章節將會更詳細地介紹 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" ]
    

    如需適用于 Windows 的 Dockerfiles 的其他範例,請參閱 適用于 Windows 的 Dockerfile 存放庫

    Dockerfile 指示會提供 Docker 引擎建立容器映射所需的指示。 這些指令會依序逐一執行。 下列範例是 Dockerfiles 中最常使用的指示。 如需 Dockerfile 指示的完整清單,請參閱 Dockerfile 參考

    FROM 指令會設定新映像建立程序期間所使用的容器映像。 比方說,在使用指令 FROM mcr.microsoft.com/windows/servercore 時,所產生的映像衍生自 (而且會相依於) Windows Server Core 基本 OS 映像。 如果指定的映像不存在於正在執行 Docker 建置流程的系統上,Docker 引擎會嘗試從公用或私用的映像登錄下載映像。

    FROM 指令的格式如下所示:

    FROM <image>
    

    以下是 FROM 命令的範例:

    若要從 Microsoft Container Registry (MCR) 下載 ltsc2019 版 Windows Server Core:

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

    如需詳細資訊,請參閱 FROM 參考

    RUN 指令指定要執行並擷取至新容器映像的命令。 這些命令可以包含安裝軟體、建立檔案和目錄,以及建立環境設定等項目。

    RUN 指令如下所示:

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

    exec 和 Shell 表單之間的差異在於指令的執行方式 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
    

    搭配 Windows 使用 RUN 的考慮

    在 Windows 中,當使用 exec 格式的 RUN 指令時,反斜線必須逸出。

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

    當目的程式是 Windows 安裝程式時,您必須透過 /x:<directory> 旗標擷取安裝程式,才能啟動實際的 (無訊息) 安裝程式。 您也必須等候命令結束,再執行任何其他動作。 否則,此程式將會提前結束,而不會安裝任何專案。 如需詳細資訊,請參閱下面的範例。

    搭配 Windows 使用 RUN 的範例

    下列範例 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>"]
    

    搭配 Windows 使用 COPY 的考慮

    在 Windows 中,目的格式必須使用正斜線。 例如,這些是有效的 COPY 指示:

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

    同時,具有反斜線的下列格式將無法運作:

    COPY test1.txt c:\temp\
    

    搭配 Windows 使用 COPY 的範例

    下列範例會將來原始目錄的內容新增至容器映射中名為 sqllite 的目錄:

    COPY source /sqlite/
    

    下列範例會將開頭為 config 的所有檔案新增至 c:\temp 容器映射的目錄:

    COPY config* c:/temp/
    

    如需指示的詳細資訊 COPY ,請參閱 COPY 參考

    ADD 指令就像 COPY 指令,但還有更多功能。 除了將檔案從主機複製到容器映像,ADD 指令也可以從具有 URL 規格的遠端位置複製檔案。

    指示 ADD 的格式如下所示:

    ADD <source> <destination>
    

    如果來源或目的地包含空白字元,請將路徑括在方括弧和雙引號中:

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

    使用 Windows 執行 ADD 的考慮

    在 Windows 中,目的格式必須使用正斜線。 例如,這些是有效的 ADD 指示:

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

    同時,具有反斜線的下列格式將無法運作:

    ADD test1.txt c:\temp\
    

    此外,ADD 指令在 Linux 上會於複製時展開壓縮的封裝。 Windows 不提供這項功能。

    搭配 Windows 使用 ADD 的範例

    下列範例會將來原始目錄的內容新增至容器映射中名為 sqllite 的目錄:

    ADD source /sqlite/
    

    下列範例會將開頭為 「config」 的所有檔案新增至 c:\temp 容器映射的目錄。

    ADD config* c:/temp/
    

    下列範例會將適用于 Windows 的 Python 下載到 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 指令設定工作目錄,例如 RUNCMD,也會為執行中的容器映像執行個體設定工作目錄。

    指示 WORKDIR 的格式如下所示:

    WORKDIR <path to working directory>
    

    搭配 Windows 使用 WORKDIR 的考慮

    在 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>
    

    搭配 Windows 使用 CMD 的考慮

    在 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 參考

    在許多情況下,Dockerfile 指令必須跨越多行。 若要這樣做,您可以使用逸出字元。 預設的 Dockerfile 逸出字元為反斜線 \。 不過,因為反斜線也是 Windows 中的檔案路徑分隔符號,所以使用它跨越多行可能會導致問題。 若要解決此問題,您可以使用剖析器指示詞來變更預設逸出字元。 如需剖析器指示詞的詳細資訊,請參閱 剖析器指示詞

    下列範例顯示單一 RUN 指令,使用預設逸出字元跨越多行:

    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
    

    若要修改此逸出字元,可以將逸出剖析器指示詞置於 Dockerfile 的第一行。 您可以在下列範例中看到。

    只能使用兩個值做為逸出字元: \`

    # 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
    

    如需逸出剖析器指示詞的詳細資訊,請參閱 逸出剖析器指示詞

    Dockerfile 中的 PowerShell

    PowerShell Cmdlet

    您可以使用作業在 Dockerfile RUN 中執行 PowerShell Cmdlet。

    FROM mcr.microsoft.com/windows/servercore:ltsc2019
    RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath c:\
    

    REST 呼叫

    從 Web 服務收集資訊或檔案時,PowerShell 的 Invoke-WebRequest Cmdlet 很有用。 例如,如果您建置包含 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。

    您也可以選擇使用 .NET WebClient 文件庫,便可在映像建立程序期間使用 PowerShell 下載檔案。 這樣會增進下載效能。 下列範例會使用 WebClient 媒體櫃下載 Python 軟體。

    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 組建的完整檔,包括所有組建選項的清單,請參閱 組建參考

    命令的格式 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
    

    進一步閱讀和參考

    優化適用于 Windows 的 Dockerfiles 和 Docker 組建 Dockerfile 參考