使用 Dockerfile 構建基于 .NET9 的跨平臺基礎鏡像

官方基礎鏡像準備

微軟官方 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 的基礎鏡像?

docker buildx

? 構建基礎鏡像

要使用提供的 Dockerfile 構建一個基于 amd64 架構的基礎鏡像,我們可以通過指定 --platform 參數為 linux/amd64 來強制構建特定架構的鏡像。

  1. 構建單個平臺鏡像
docker build --platform linux/amd64 -t your-amd64-image-name:tag ./
  1. 使用 buildx 構建多平臺鏡像

或者我們也可以指定多個目標平臺,例如同時構建 amd64arm64

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 ./

?? 注意事項:

  1. 確保 Docker 支持多平臺構建
    • 推薦使用支持 buildxDocker 版本(建議 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 驅動,支持多平臺交叉編譯。

  1. 若需推送到鏡像倉庫,請在構建后使用 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90046.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90046.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90046.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ : 線程庫

C : 線程庫一、線程thread1.1 thread類1.1.1 thread對象構造函數1.1.2 thread類的成員函數1.1.3 線程函數的參數問題1.2 this_thread 命名空間域1.2.1 chrono二、mutex互斥量庫2.1 mutex的四種類型2.1.1 mutex 互斥鎖2.2.2 timed_mutex 時間鎖2.2.3 recursive_muetx 遞歸鎖2.2.…

idea的使用小技巧,個人向

idea的使用小技巧,個人向 一、前言二、過程1、顯示內存的使用情況2、去掉xml文件中的黃色背景3、顯示所有打開文件4、顯示工具欄到菜單下面5、使用JDK8 一、前言 每次重裝idea都需要重新設置一下,這里做個記錄。 這些技巧只是個人感覺的好用 演示用的…

debian及衍生發行版apt包管理常見操作

好的,這是 Debian 及其衍生版(如 Ubuntu)使用的 apt 包管理器的常用命令速查表。 一點說明:apt 是新一代的命令行工具,整合了 apt-get 和 apt-cache 的常用功能,并提供了更友好的交互體驗。本表主要使用現…

vue調用函數

好的,我們來講解如何在 Vue 模板中調用函數。您提供的代碼是一個非常棒的、很實用的例子。 在 Vue 模板中,你可以在兩個主要地方調用函數: 文本插值中:像 {{ formatDate(date) }} 這樣,函數的返回值會作為文本被渲染到…

前端常用構建工具介紹及對比

打包構建工具是現代軟件開發中必不可少的,它們幫助開發者自動化構建、打包、部署等流程,提升開發效率。不過,不同時期構建工具略有差異。 每個構建工具都有其擅長的領域,我們需要知道其優勢,才能在我們實際開發中選擇合適的構建工具進行構建處理。 1. Gulp Gulp 是一個…

Web后端開發-SpringBootWeb入門、Http協議、Tomcat

文章目錄Web后端開發簡介SpringBootWeb入門HTTP協議HTTP-概述HTTP-請求協議HTTP-響應協議HTTP-協議解析Web服務器-Tomcat簡介基本使用SpringBootWeb入門程序解析Web后端開發簡介 SpringBootWeb入門 package com.wuxuan.javaweb_wushuang.controller;import org.springframework…

物聯網通信技術全景剖析:從LoRa到5G的深度對比與選型指南

物聯網通信技術全景剖析:從LoRa到5G的深度對比與選型指南在萬物互聯時代,選擇合適的通信技術如同為設備構建“神經網絡”。本文將深入解析七大主流物聯網通信技術,助您在技術選型中精準決策。一、低功耗廣域網(LPWAN)技…

俄羅斯方塊AI深度解析:從算法原理到實現細節

俄羅斯方塊AI深度解析:從算法原理到實現細節 前言 俄羅斯方塊,這個誕生于1984年的經典游戲,至今仍然是人工智能研究領域的熱門課題。當簡單的幾何形狀在網格中不斷下落時,看似簡單的規則背后卻隱藏著復雜的策略決策問題。本文將深入剖析一個基于Python實現的俄羅斯方塊AI…

Spring Boot 框架創建一個簡單的后端接口,并介紹如何使用 Apifox 連接該接口

目錄 一、配置 二、使用 IntelliJ IDEA 創建 Spring Boot 項目 1.打開 IntelliJ IDEA,選擇 File > New > Project 2.在左側面板選擇 Spring Initializr,項目名稱設置為HelloWorldAPI 3.點擊 Create 完成項目創建 三、創建控制器類 四、運行項…

CICD[導航]、docker+gitlab+harbor+jenkins從安裝到部署

一、安裝 CICD[軟件安裝]:docker安裝gitlab-CSDN博客 CICD[軟件安裝]:ubuntu安裝jenkins-CSDN博客 CICD[軟件安裝]:ubuntu安裝私有鏡像倉庫-Harbor-CSDN博客 CICD[軟件安裝]:ubuntu24安裝Docker-CSDN博客 二、鏡像執行 CICD[…

深度學習圖像分類數據集—蘑菇識別分類

該數據集為圖像分類數據集,適用于ResNet、VGG等卷積神經網絡,SENet、CBAM等注意力機制相關算法,Vision Transformer等Transformer相關算法。 數據集信息介紹:蘑菇識別分類:[Agaricus, Amanita, Boletus, Cortinarius, …

iOS 多線程導致接口亂序?抓包還原 + 請求調度優化實戰

在一次性能優化過程中,我們將 iOS App 內多處請求改為并行處理,以提高頁面加載速度。但上線后卻收到部分用戶反饋:進入頁面后數據加載錯亂,有時展示前一次頁面內容,有時同一個接口請求重復返回不同內容。 日志僅顯示正…

PDFBox 在 Linux 報 “No glyph for U+535A (博)” —— 一次子集化踩坑與完整排查清單

PDFBox 在 Linux 報 “No glyph for U535A (博)” —— 一次子集化踩坑與完整排查清單關鍵詞:PDFBox、PDType0Font、子集嵌入(subset embedding)、SimHei、思源黑體、字體回退1. 背景業務場景 后端使用 Apache PDFBox 填充含 AcroForm 的中文…

網安系列【8】之暴力破解入門

文章目錄 引用資料一 什么是暴力破解?二 暴力破解的工作原理三 暴力破解的類型3.1 傳統暴力破解3.2 字典攻擊3.3 混合攻擊3.4 彩虹表攻擊 四 暴力破解實戰演示4.1 環境和工具4.2 破解操作 五 防御暴力破解的策略六 暴力破解的相關法律七 延伸學習總結 引用資料 Bur…

使用tensorflow的線性回歸的例子(四)

與經典線性回歸比較 import matplotlib.pyplot as plt %matplotlib inline import tensorflow as tf import numpy as np from sklearn.linear_model import LinearRegression #from sklearn.datasets.samples_generator import make_regression Xdata np.array([4.0, …

服務器中故障轉移機制是指什么意思?

在企業服務器和數據中心當中,電源冗余機制和故障轉移機制是保障系統高可用性和穩定性的重要組成部分,電源故障轉移系統可以幫助企業有效減少服務器因為硬件故障導致業務中斷的情況,本文就來詳細了解一下服務器中故障轉移機制。服務器中的故障…

rook-ceph的osd沒有啟動rook-ceph-osd-prepare狀態異常處理

rook-ceph搭建好ceph之后,查看ceph集群狀態,發現三節點只有兩個osd狀態正常注:這里是已經恢復后的截圖。 使用kubectl get pod -n rook-ceph查看pod都是處于運行狀態 rook-ceph-osd-prepare也都是Completed沒問題,實際使用kubectl…

ubuntu手動編譯VTK9.3 Generating qmltypes file 失敗

?在Ubuntu上手動編譯VTK 9.3時,可能會遇到 Generating qmltypes file失敗的問題。這個問題通常與VTK在處理Qt依賴時發生的錯誤有關。以下是解決該問題的詳細步驟和相關解釋。一、確保系統依賴正確安裝在編譯VTK之前,需要確保所有依賴項已經正確安裝&…

計算機科學導論(1)哈佛架構

文章目錄一、哈佛架構的定義與起源二、哈佛架構的核心組成與工作原理1. **物理結構:獨立的存儲與總線**2. **工作流程:并行處理的實現**三、哈佛架構與馮諾依曼架構的對比四、哈佛架構的優缺點分析1. **優勢**2. **局限性**五、哈佛架構的實際應用場景1.…

VBScript 安裝使用教程

一、VBScript 簡介 VBScript(Visual Basic Scripting Edition)是微軟推出的一種輕量級腳本語言,語法類似于 Visual Basic,廣泛應用于系統管理、自動化腳本、網頁客戶端(IE 專屬)以及 Windows 批處理等場景…