# 多阶段构建 Dockerfile # 第一阶段:构建前端 # 使用官方 Docker Hub(mcr 能访问的环境一般也能访问 docker.io) FROM node:18-alpine AS frontend-builder WORKDIR /app/frontend # 复制前端依赖文件 COPY app/package.json app/pnpm-lock.yaml* ./ # 配置 npm 和 pnpm 使用国内镜像源 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 --frozen-lockfile; \ else \ npm install; \ fi # 复制前端源码 COPY app/ ./ # 构建前端 RUN pnpm build || npm run build # 第二阶段:构建后端 FROM mcr.m.daocloud.io/dotnet/sdk:6.0 AS backend-builder WORKDIR /src # 复制项目文件 COPY *.csproj ./ RUN dotnet restore dy.net.csproj # 复制所有文件 COPY . . # 删除 macOS 资源分叉文件(._* 文件) 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 # 第三阶段:运行镜像 FROM mcr.m.daocloud.io/dotnet/aspnet:6.0 AS final WORKDIR /app # 设置时区 ENV TZ=Asia/Shanghai RUN ln -snf /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"]