# 多阶段构建 Dockerfile # 第一阶段:构建前端 FROM node:18-alpine AS frontend-builder WORKDIR /app/frontend COPY app/package.json app/pnpm-lock.yaml* ./ RUN npm config set registry https://registry.npmmirror.com && \ npm install -g pnpm && \ pnpm config set registry https://registry.npmmirror.com && \ if [ -f pnpm-lock.yaml ]; then \ pnpm install --no-frozen-lockfile; \ else \ npm install; \ fi COPY app/ ./ RUN pnpm build || npm run build # 第二阶段:构建后端 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS backend-builder WORKDIR /src COPY *.csproj ./ RUN dotnet restore dy.net.csproj COPY . . RUN find . -name "._*" -type f -delete COPY --from=frontend-builder /app/frontend/dist ./app/dist RUN dotnet publish dy.net.csproj -c Release -o /app/publish # 第三阶段:运行镜像(Alpine 版:apk 包更小、代理下更易通过) FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine AS final WORKDIR /app ENV TZ=Asia/Shanghai RUN apk add --no-cache tzdata ffmpeg && \ cp /usr/share/zoneinfo/$TZ /etc/localtime && \ echo $TZ > /etc/timezone COPY --from=backend-builder /app/publish . EXPOSE 10101 ENV ASPNETCORE_URLS=http://*:10101 ENV ASPNETCORE_ENVIRONMENT=Production ENTRYPOINT ["dotnet", "dy.net.dll"]