文章目錄
從 arm64 macOS 建立 Linux x64 ASP.NET Docker Image 卡在 dotnet restore
之前筆記 為 ASP.NET Core 建立 Multi-Platform image 紀錄到如何使用 buildx 來建立 linux/amd64 與 linux/arm64 的 docker image,當時提到 .NET 8 以前需要使用條件式編譯,而 .NET 8 開始加強了 container 相關支援在 DOCKERFILE 上會簡潔許多,但當時因為 .NET 8 尚未正式上市,部份功能測試起來不符預期(ex: self-contained deployments),最近因為團隊開始正式升級 .NET 8,過程中遇到一些問題,今天就來紀錄一下使用 arm (Apple M2 Pro) build linux/amd64 docker image 會卡在 dotnet restore 的狀況
基本環境說明
- macOS Sonoma 14.3.1 (Apple M2 Pro)
- OrbStack Version 1.4.3 (16673)
- .NET 8.0.101
- JetBrains Rider 2023.3.3
預設 ASP.NET Core Web Application Web API 專案範本 (啟用 Linux Docker Support)
Dockerfile
.dockerignore
Container Images
- mcr.microsoft.com/dotnet/aspnet:8.0
- mcr.microsoft.com/dotnet/sdk:8.0
問題描述
預設的 Dockerfile 我自己執行上有遇到問題,稍微調整一下結構
Dockerfile
- 把
COPY ["Dotnet8ContainerBuild/Dotnet8ContainerBuild.csproj", "Dotnet8ContainerBuild/"]
改為COPY ["Dotnet8ContainerBuild.csproj", "Dotnet8ContainerBuild/"]
WORKDIR "/src/Dotnet8ContainerBuild"
與COPY . .
交換順序
- 把
linux/arm64 build 正常
語法
docker buildx build -f Dockerfile --platform linux/arm64 -t yowko/dotnet8container:v1 --load .
截圖
linux/amd64 build 卡在 dotnet restore
語法
docker buildx build -f Dockerfile --platform linux/amd64 -t yowko/dotnet8container:v1 --load .
截圖
設定方式
Github 上也不少人反應相關問題:.NET6 docker build stuck on dotnet restore、Emulated x86 and x64 .NET 7 on ARM64 can’t create new project、.NET8 docker build stuck on dotnet restore,Microsoft PM - Richard Lander 的回覆:GitHub:.NET8 docker build stuck on dotnet restore 有兩種解法:
Dockerfile 中使用
$BUILDPLATFORM
詳細內容可以參考 Richard Lander 的文章 Improving multi-platform container support
在 build 時使用
--build-arg BUILDPLATFORM
來指定平台FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build
修改後 Dockerfile
實際效果
使用
Rosetta
模擬器Rosetta
在 M1 問市時測試過效能不佳,後來就沒有再使用
心得
目前這個 issue: GitHub:.NET8 docker build stuck on dotnet restore 還沒有解決,如果需要在 arm 上建立 linux/amd64 docker image,目前使用 $BUILDPLATFORM
來指定平台是相對方便的,雖然這樣的做法會讓 Dockerfile 變髒,但至少可以解決問題
完整程式碼請參考:Github:yowko/Dotnet8ContainerBuild
參考資訊
文章作者 Yowko Tsai
上次更新 2024-04-04
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。