当前位置: 首页 > news >正文

基于 alpine 构建 .net 的基础镜像

准备基础镜像

  • alpine:3.22

完整的 Dockerfile 如下:

# 使用官方的 Alpine 3.22 镜像作为基础镜像
FROM --platform=$TARGETPLATFORM alpine:3.22 AS builder# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive# 创建目录结构
WORKDIR /app# 备份原始源文件并更换为阿里云的镜像源
RUN cp /etc/apk/repositories /etc/apk/repositories.bak && \sed -i 's|https://dl-cdn.alpinelinux.org/alpine|https://mirrors.aliyun.com/alpine|g' /etc/apk/repositories# 安装常用工具与依赖
RUN apk add --no-cache \wget \gnupg \curl \bash \shadow \su-exec \libintl \libssl3 \icu-libs \krb5-libs \libpng \zlib \glib \dbus \atk \pango \gdk-pixbuf \gtk3 \libX11 \libXext \libXrender \libXinerama \libXi \libXrandr \libXcursor \libXdamage \libXcomposite \libXtst \cups-libs \gst-plugins-base \ffmpeg && \# 添加 Microsoft 包仓库wget -O /tmp/microsoft.asc https://packages.microsoft.com/keys/microsoft.asc && \gpg --import /tmp/microsoft.asc && \echo "https://packages.microsoft.com/repos/microsoft-alpine-$(cat /etc/os-release | grep -Po 'VERSION_ID=\"\K[^\"+]')-stable main" > /etc/apk/repositories.d/microsoft-apex.repo && \rm -rf /tmp/* && \apk update && \apk add --no-cache powershell# 安装 .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# 安装全局工具 codegenerator 和 aspire 
RUN dotnet workload install aspire && \dotnet tool install -g dotnet-aspnet-codegenerator# 创建非 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# 最终运行阶段(精简)
FROM alpine:3.22# 复用前面阶段的环境变量和安装结果
COPY --from=builder /root/.dotnet /root/.dotnet
COPY --from=builder /home/appuser /home/appuser
COPY --from=builder /app /app# 设置工作目录
WORKDIR /app# 将 .NET CLI 添加到 PATH 环境变量
ENV PATH="/root/.dotnet:${PATH}"# 安装最小运行时依赖
RUN apk add --no-cache \libintl \libssl3 \icu-libs \krb5-libs && \rm -rf /var/cache/apk/*# 切换用户
USER appuser# 设置默认 Shell(可选)
SHELL ["/bin/bash", "-c"]# 输出测试信息
CMD ["sh", "-c", "echo 'Alpine 镜像源已成功更换为阿里云!PowerShell 和 .NET SDK 已安装。'"]

说明:安装常用工具与依赖,此处可以依据实际使用到的工具安装,生产环境防止安全隐患,应该使用最小化原则安装,只安装实际使用到的工具包,减少不必要的攻击面风险。

🧼 总结

  • 备份了原始源文件:通过 cp /etc/apk/repositories /etc/apk/repositories.bak 实现。
  • 清理缓存:使用 rm -rf /var/cache/apk/* 清理 apk 缓存。
  • 多阶段构建:提升最终镜像纯净度,去除构建依赖。
  • 减少 RUN 层数:将多个命令合并为一个 RUN,避免不必要的中间层残留。
http://www.lryc.cn/news/579558.html

相关文章:

  • 基于MATLAB的风力发电机无人机巡检路径优化研究
  • 利用人名语言分类案例演示RNN、LSTM和GRU的区别(基于PyTorch)
  • Go调度器的抢占机制:从协作式到异步抢占的演进之路|Go语言进阶(7)
  • Android Profiler 丢帧分析教程及案例
  • WPF学习笔记(22)项面板模板ltemsPanelTemplate与三种模板总结
  • 【Git】同时在本地使用多个github账号进行github仓库管理
  • 两级缓存 Caffeine + Redis 架构:原理、实现与实践
  • locate 命令更新机制详解
  • 小红书自动化操作:使用本地Chrome和User Data实现高效反检测
  • Linux系统(信号篇):信号的处理
  • spring6合集——spring概述以及OCP、DIP、IOC原则
  • MongoDB Memory Server与完整的MongoDB的主要区别
  • CANFD芯片在工控机数据采集和测量中的应用分析
  • 重新学习Vue中的按键监听和鼠标监听
  • PDF的图片文字识别工具
  • 110道Python面试题(真题)
  • Spring AI ETL Pipeline使用指南
  • 01_前后端打包发布、API接口调试
  • Stata如何做机器学习?——SHAP解释框架下的足球运动员价值驱动因素识别:基于H2O集成学习模型
  • Spring生态:引领企业级开发新纪元
  • Linux开发工具——gcc/g++
  • 【CSS揭秘】笔记
  • Ubuntu20.4编译AOSP源码实践
  • 开源 C# .net mvc 开发(六)发送邮件、定时以及CMD编程
  • XILINX Ultrascale+ Kintex系列FPGA的架构
  • 支持向量机(SVM)分类
  • ReactNative【实战系列教程】我的小红书 3 -- 自定义底栏Tab导航(含图片选择 expo-image-picker 的使用)
  • GPT-2论文阅读:Language Models are Unsupervised Multitask Learners
  • Mac电脑 触摸板增强工具 BetterTouchTool
  • 探秘展销编辑器:相较于传统展销的卓越优势与甄选指南​