官方基礎鏡像準備
微軟官方 dotnet sdk
基礎鏡像:
docker pull mcr.microsoft.com/dotnet/sdk:9.0
拉取 ubuntu
鏡像:
docker pull ubuntu:24.04
更多資源請參考:
- dotnet sdk images,
https://mcr.microsoft.com/en-us/artifact/mar/dotnet/sdk/tags
- github docker buildx ,
https://github.com/docker/buildx
- 阿里云開源鏡像站,
https://developer.aliyun.com/mirror/
- 微軟官方包源,
https://packages.microsoft.com/config/
構建私有化基礎鏡像
此處使用到的相關資源:
- dotnet sdk 9.0
- dotnet aspire
- PowerShell
- Ubuntu Server 24.04
Ubuntu 24.04 軟件源位置調整
Ubuntu 24.04
的軟件源位置調整后,需要根據新的文件路徑或結構進行修改。
以下是調整方法:
1. 確認源文件路徑
注意 Ubuntu 24.04
的源文件路徑已從傳統的 /etc/apt/sources.list
文件遷移到使用 sources.list.d/
目錄下的單獨 .sources
文件。例如:
- 原路徑:
/etc/apt/sources.list
- 新路徑:
/etc/apt/sources.list.d/ubuntu.sources
2. 修改源地址
在修改 Ubuntu
的源文件之前,建議先進行備份。
RUN cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
如果發現軟件源位置有調整,可以使用以下命令來替換為阿里云的鏡像源:
RUN sed -i 's|http://archive.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list.d/ubuntu.sources && \sed -i 's|http://security.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list.d/ubuntu.sources
3. 更新包索引
修改完成后,運行以下命令更新包索引:
apt update
4. 驗證源是否生效
可以通過安裝一個測試包來驗證新源是否正常工作。
如果系統提示找不到源文件,請檢查路徑是否正確,并確保你正在編輯的是當前系統實際使用的 .sources
文件。
構建 Ubuntu 基礎鏡像
制作 .NET
平臺的 Ubuntu
基礎鏡像,完整的 Dockerfile
內容如下:
# 使用官方的 Ubuntu 24.04 鏡像作為基礎鏡像
FROM --platform=$TARGETPLATFORM ubuntu:24.04# 設置環境變量,避免交互式安裝時的提示
ENV DEBIAN_FRONTEND=noninteractive# 創建目錄結構
WORKDIR /app# 備份原始源文件并更換為阿里云的鏡像源
RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak && \cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak && \sed -i 's|http://archive.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list && \sed -i 's|http://security.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list.d/ubuntu.sources# 更新包列表并安裝常用工具,并立即清理緩存
RUN apt update && \apt upgrade -y && \apt install -y wget software-properties-common gnupg curl && \rm -rf /var/lib/apt/lists/* && \apt clean# 安裝 PowerShell 的依賴并清理
RUN apt update && \apt install -y --no-install-recommends \apt-transport-https \ca-certificates && \rm -rf /var/lib/apt/lists/* && \apt clean# 添加 Microsoft 包倉庫并安裝 PowerShell
RUN wget -q https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb && \dpkg -i packages-microsoft-prod.deb && \rm packages-microsoft-prod.deb && \apt update && \apt install -y powershell && \rm -rf /var/lib/apt/lists/* && \apt clean# 安裝 .NET SDK 并清理
RUN wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh && \chmod +x dotnet-install.sh && \./dotnet-install.sh -c Current && \rm dotnet-install.sh# 將 .NET CLI 添加到 PATH 環境變量
ENV PATH="/root/.dotnet:${PATH}"# 安裝 .NET Aspire 和 ASP.NET Core 的代碼生成器工具并清理
RUN dotnet workload install aspire && \dotnet tool install -g dotnet-aspnet-codegenerator && \dotnet nuget locals all --clear# 創建非 root 用戶和組(安全處理已存在的情況)
RUN if getent group appgroup > /dev/null; then groupdel appgroup; fi && \if getent passwd appuser > /dev/null; then userdel appuser; fi && \groupadd -g 1000 appgroup && \useradd -u 1000 -g appgroup -m appuser# 設置工作目錄權限
RUN chown -R appuser:appgroup /app# 切換到非 root 用戶
USER appuser# 設置默認 Shell 為 PowerShell(可選)
SHELL ["pwsh", "-Command"]# 輸出測試信息
CMD ["sh", "-c", "echo 'Ubuntu 鏡像源已成功更換為阿里云!PowerShell 和 .NET SDK 已安裝。'"]
? 優化點說明
- APT 緩存清理:每次使用
apt install
后都執行rm -rf /var/lib/apt/lists/*
和apt clean
,以清除包索引和緩存。 - 臨時文件清理:如安裝
.NET SDK
后刪除了腳本文件dotnet-install.sh
。 NuGet
緩存清理:使用dotnet nuget locals all --clear
清除NuGet
包緩存。
這樣可以顯著減少最終鏡像的體積,同時保持功能不變。
? 構建命令
docker build --platform linux/amd64 -t dotnet-sdk:ubuntu-24.04 ./
? 運行容器并驗證安裝
docker run --rm dotnet-sdk:ubuntu-24.04 pwsh -c "dotnet --info"
我們還可以進入容器內進行調試:
docker run -it dotnet-sdk:ubuntu-24.04 pwsh
此處我們就構建了基于 Ubuntu 24.04
的 .NET SDK
基礎鏡像。
使用示例
如何使用 Dockerfile
構建 .NET
的基礎鏡像?
? 構建基礎鏡像
要使用提供的 Dockerfile
構建一個基于 amd64
架構的基礎鏡像,我們可以通過指定 --platform
參數為 linux/amd64
來強制構建特定架構的鏡像。
- 構建單個平臺鏡像
docker build --platform linux/amd64 -t your-amd64-image-name:tag ./
- 使用
buildx
構建多平臺鏡像
或者我們也可以指定多個目標平臺,例如同時構建 amd64
和 arm64
:
docker buildx build \--platform linux/amd64,linux/arm64 \-t your-dockerhub-username/image:tag \--push \./
📌 參數解釋
🔹--platform linux/amd64,linux/arm64
:指定目標平臺為 amd64(x86_64)
和 arm64(RISC)
架構。
🔹-t your-dockerhub-username/image:tag
:為鏡像打標簽,如 aspire-dotnet-sdk:9.0
。
🔹 --push
表示構建后推送到遠程倉庫(需登錄 Docker Hub
或私有鏡像倉庫)。
🔹 如果你不希望推送,可以去掉 --push
并使用 --load
加載本地鏡像(但僅限當前平臺)。
🔹./
:表示當前目錄為構建上下文。
說明:使用
docker buildx
實現真正的多平臺鏡像構建能力。
🧼 構建示例
此處我們構建一個 Linux
環境多平臺(amd64,arm64
)支持的基礎鏡像,命令如下:
docker buildx build --platform linux/amd64,linux/arm64 -t aspire-dotnet-sdk-amd64:9.0 --load ./
?? 注意事項:
- 確保 Docker 支持多平臺構建:
- 推薦使用支持
buildx
的Docker
版本(建議20.10+
)。 - 若提示
--platform
不被支持,請啟用buildx
:
- 推薦使用支持
- 啟用
buildx
構建器并設置為默認
# 創建并使用一個支持多平臺的構建器
docker buildx create --use --name mybuilder# 啟動構建器(如果剛創建可能不需要再啟動)
docker buildx inspect --bootstrap
- 此時你應該看到類似輸出:
Name: mybuilder
Driver: docker-container
Nodes:
Name: mybuilder0
OS/Arch: linux/amd64
?
docker buildx
使用docker-container
驅動,支持多平臺交叉編譯。
- 若需推送到鏡像倉庫,請在構建后使用
docker push
命令:
docker push your-image-name:tag
🔁 小結
操作 | 命令 |
---|---|
創建 buildx 構建器 | docker buildx create --use --name mybuilder |
構建并推送多平臺鏡像 | docker buildx build --platform linux/amd64,linux/arm64 -t user/repo:tag --push . |
本地加載單平臺鏡像 | docker buildx build --platform linux/amd64 -t local-image:tag --load . |
查看多平臺鏡像信息 | docker buildx imagetools inspect user/repo:tag |