文章目錄
為 ASP.NET Core 建立 Multi-Platform image
最近公司正在逐步汰換使用年限到期的電腦:由 MacBook Pro (intel) 換為 MacBook Pro (M2 Pro),CPU 架構從 x86/x64 改為 arm64,許多軟體工具都需要改用特定版本才能正常使用,雖然在 M1 初問世就已經做過一輪測試跟 poc 也先做一些預先調整,其中一個就是啟用 buildx
來建立 Multi-Platform image,只是當初沒有經過全面驗證,這次實際更換機器時問題就陸續出現,今天就是要來紀錄一下 ASP.NET Core 的 Multi-Platform image 在 arm 上遇到的問題
基本環境說明
- macOS Ventura 13.4
- OrbStack 0.13.0(1910)
- docker images
- mcr.microsoft.com/dotnet/sdk:6.0
- mcr.microsoft.com/dotnet/aspnet:6.0
- mcr.microsoft.com/dotnet/sdk:8.0-preview-alpine
- mcr.microsoft.com/dotnet/aspnet:8.0-preview-alpine
- ASP.NET Core 預設 web api 專案範本
build multiple-platform
docker buildx build -f Dockerfile --platform linux/amd64,linux/arm64 -t yowko/multiplearch --push .
設定方式
使用 .NET 8 以前 SDK
主要的 dockerfile 結構是官方的,條件式內容則是參考 GitHub: f2calv/multi-arch-container-dotnet
使用 .NET 8 SDK (尚有相容性問題,詳細問題可以看
心得
)這個是參考 Microsoft PM - Richard Lander 的文章:Improving multi-platform container support,dockerfile 也是官方的範例來的 samples/aspnetapp/Dockerfile.alpine-non-root
心得
目前看到 .NET 8 的改變有兩個部份
- 新增
-a
參數,是-r
的快捷鍵:${TARGETOS}/${TARGETARCH}
等於${TARGETPLATFORM}
,SDK 內部應該還有一層 mapping 做 RID 的轉換 - publish 時
-c Release
已改為預設參數
- 新增
ASP.NET Core 針對 Multi-Platform 我自己覺得不同以往的部份
- stage 1 的 FROM 有指定 builder 的 image platform
- restore 有加上
-a
指定特定平台套件 - image size 差很多 (
sdk 8
: 109MB,sdk 6
: 306MB)
我參考 Microsoft PM - Richard Lander 的文章:Improving multi-platform container support 使用 SDK 加入的參數並嘗試幾種不同方式得到幾個不同錯誤,紀錄一下
用相同 dockerfile 來 build .NET 6 的專案,出現需要安裝 .NET runtime 的提示訊息
使用
mcr.microsoft.com/dotnet/sdk:8.0-preview-alpine
builder ,runtime 改用mcr.microsoft.com/dotnet/aspnet:6.0
出現找不到檔案指定
--self-contained true
會 build fail使用 .NET 8 的條件式來編譯出現找不到檔案
參考資訊
文章作者 Yowko Tsai
上次更新 2023-08-25
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。