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