当前位置: 首页 > 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.dtcms.com/a/265475.html

相关文章:

  • 开源模型应用落地-让AI更懂你的每一次交互-Mem0集成Qdrant、Neo4j与Streamlit的创新实践(四)
  • Zookeeper 客户端 .net访问框架 ZookeeperNetEx项目开发编译
  • 开源 C# .net mvc 开发(六)特殊控制控制台、周期、邮件编程
  • 深度实战:Ubuntu服务器宕机排查全记录
  • 月付物理服务器租用平台-青蛙云
  • 基于 govaluate 的监控系统中,如何设计灵活可扩展的自定义表达式函数体系
  • npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree
  • Python Set() 完全指南:从入门到精通
  • R语言开发记录,一
  • 前端-HTML-day1
  • Rust Web 全栈开发(二):构建 HTTP Server
  • 主流分布式中间件及其选型
  • locate命令的原理是啥
  • OpenCV CUDA模块设备层-----在GPU 上高效地执行两个 uint 类型值的最大值比较函数vmax2()
  • Frida:配置自动补全 in VSCode
  • 搭建VirtualBox-6+vagrant_2+docker+mysql5.7的步骤
  • 客户案例 | 某新能源车企依托Atlassian工具链+龙智定制开发服务,打造符合ASPICE标准的研发管理体系
  • 云原生系统DOCKER中容器系统搭建
  • Python字符与ASCII转换方法
  • Ubuntu Gnome 安装和卸载 WhiteSur-gtk-theme 类 Mac 主题的正确方法
  • vue2+elementui使用compressorjs压缩上传的图片
  • Euler2203安装.NetCore6.0环境操作步骤
  • python安装虚拟环境
  • Python 物联网(IoT)与边缘计算开发实战(1)
  • 优雅草蜻蜓R实时音视频会议系统云原生私有化部署方案深度解析-优雅草卓伊凡|贝贝|clam|麻子|夜辰
  • Docker 容器资源限制
  • 9.Docker的容器数据卷使用(挂载)
  • ATE FT ChangeKit学习总结-20250630
  • 网络的封包与拆包
  • 基于Java的企业项目管理与协作系统设计与实现