官方基础镜像准备

微软官方 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 批处理等场景…