准备基础镜像
- 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
,避免不必要的中间层残留。