製作Windows Container映像檔注意事項

製作Windows Container映像檔注意事項

由於專案需求多變,有時需要自行建置客製化 Windows 基礎映像檔(Base Image)來使用,就在是在微軟官方的基礎映像檔之上去安裝軟體、設定環境等,像之前的文章:WINDOWS CONTAINER之.NET CORE找不到GDIPLUS.DLL解決方案為例,我們就把 ASP.NET Core Runtime 安裝至 Server Core 基礎映像檔,微軟官方應用程式的映像檔除非特別理由,不然通常最終都會以 Nano Server 為基礎映像檔來提供。

以目前最新 Tag 1903 來看:

  • nanoserver:1903 解壓縮後約 156 MB
  • servercore:1903 解壓縮後約 4.63 GB

你想想,這中間 Nano Server 被拔除了多少東西,我常這樣分享:「Nano Server 單純只是含 Network I/O 與 Disk I/O 的作業系統。」但這就可能造成上面 GDIPLUS.DLL 文章的情境。而這一次,我們需求 Windows Server Core + .NET Core Runtime 來提供 .NET Core 應用程式的 Excel 匯出程式來使用,以此為例來教大家如何客製化自己的 Windows 基礎映像檔與一些注意事項。

手動映像檔安裝 .NET Core Runtime

在映像檔裡去安裝軟體,通常希望盡量是單純的執行檔(綠色軟體),而不要是 setup.exe 這類的會有互動畫面「下一步」安裝檔。如同我們開發專案一樣,最後只是把編譯出來 DLL 給複製進去容器一樣,越單純越好。

以安裝 .NET Core 為例,在 Windows 下載的區塊,你能發現微軟都有提供 Installer 與 Binaries:

  • Installer:有互動安裝畫面的安裝應用程式。
  • Binaries:.zip 解壓縮檔,內含編譯好的 .exe 可執行檔。
download dotnet

以我們的需求區分,看最終是不是要執行 Web,可以選擇以下兩個:

  • ASP.NET Core Binaries
  • .NET Core Binaries

以目前非自動化方式,只需要下載 .NET Core Runtime 的 .zip 檔案,在 Windows Server Core 基礎映像檔裡去解開 .zip 檔案,這樣就完成了。接下來只要透過 docker commit 就能產出含 .NET Core Runtime 的 Windows Server Core 基礎映像檔。

Dockerfile - Server Core + .NET Core Runtime

.NET Core Runtime 進版速度不慢。如果希望可以透過 Dockerfile 來進行自動化建置「含 .NET Core Runtime 的 Windows Server Core 基礎映像檔」這一作業,那麼可以利用下面的腳本來作業:

Server Core

# escape=`
FROM mcr.microsoft.com/windows/servercore:1903
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

ENV DOTNET_VERSION 2.2.5

RUN Invoke-WebRequest -OutFile dotnet.zip https://dotnetcli.blob.core.windows.net/dotnet/Runtime/$Env:DOTNET_VERSION/dotnet-runtime-$Env:DOTNET_VERSION-win-x64.zip; `
    $dotnet_sha512 = 'e3cce1a8fa304aff40fa1cf6b278ceda60d341dfa25c31449decd8900b6e49fc1dac34888853eba6e9ad610580f1689b90b5e9110826eb5ce80cf781696da98c'; `
    if ((Get-FileHash dotnet.zip -Algorithm sha512).Hash -ne $dotnet_sha512) { `
        Write-Host 'CHECKSUM VERIFICATION FAILED!'; `
        exit 1; `
    }; `
    `
    Expand-Archive dotnet.zip -DestinationPath $Env:ProgramFiles\dotnet; `
    Remove-Item -Force dotnet.zip

這裡只是透過 PowerShell 的幫忙下載與解壓縮,以完成 .NET Core Runtime 的安裝工作。

設定 PATH 環境變數

我們自己安裝或設定的軟體路徑不會在 PATH 環境變數之中,也就是說,如果這樣就發行出去,那麼使用者必須指定絕對路徑才能呼叫到正確的應用程式。例如:C:\Program Files\dotnet\dotnet.exe 這為後續使用的開發者帶來了不方便。

在 Server Core 為基礎映像檔的 Dockerfile 只要加上一行 RUN 並透過 PowerShell 來加入應用程式路徑至 PATH 變數,這樣開發者不論在何處,都能確保呼叫 dotnet.exe 時都能正確執行:

RUN $Env:PATH = 'C:\Program Files\dotnet;' + $Env:PATH; `
    [Environment]::SetEnvironmentVariable('PATH', $Env:PATH, [EnvironmentVariableTarget]::Machine)
check Container PATH

Nano Server 與 PATH 環境變數

補充 Nano Server 的 PATH 環境變數設定方式:

USER ContainerAdministrator
RUN setx /M PATH "%PATH%;C:\Program Files\dotnet"
USER ContainerUser

Nano Server 容器需要先切換至高權限的 ContainerAdministrator 才能進行 PATH 設定。

小結

在客製化映像檔時有幾點要注意:

  • 軟體盡量是綠色免安裝軟體較佳。
  • 軟體就是需要 setup.exe 來安裝,也不用怕,通常都會有提供「安靜安裝」的選擇,查一下文件。
  • 最好設定 PATH 環境變數。

當然,如果你直接把軟體解壓縮放在 C:\ 底下來執行,可能跳過 PATH 這一步驟也能正常執行。不過,我個人是不建議,最好按照原始 Windows 設計來配置,以免出現什麼不知名的問題。

GitHub完整範例:https://github.com/kkbruce/dockerfiles-windows,喜歡給顆星星哦。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。