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

发布于:2025-07-05 ⋅ 阅读:(19) ⋅ 点赞:(0)

准备基础镜像

  • 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,避免不必要的中间层残留。

网站公告

今日签到

点亮在社区的每一天
去签到