# ============================================================ # 容器内编译 + 打包镜像(多阶段) # # 用途:本机构建时使用。编译发生在 Docker 的 Linux 虚拟机内, # Windows 上的杀软(如火绒)无法拦截中间产物 AdminApi.dll 等, # 可规避「dll 生成后被删除导致 MSB3030」的问题。 # # 由 deploy/build-local.ps1 调用,构建上下文 = 仓库根目录: # docker build -f deploy/Dockerfile.build \ # --build-arg PROJECT=<项目csproj相对路径,正斜杠> \ # --build-arg SVC_NAME=<服务名,如 admin> \ # --build-arg APP_DLL=<入口dll,如 AdminHost.dll> \ # --build-arg PUBLIC_HOST=<捕鱼对外地址> \ # -t 0524<服务名> . # ============================================================ ARG SDK_IMAGE=mcr.microsoft.com/dotnet/sdk:8.0 ARG RUNTIME_IMAGE=mcr.microsoft.com/dotnet/aspnet:8.0 # ---------- 阶段一:编译发布 ---------- FROM ${SDK_IMAGE} AS build ARG PROJECT ARG SVC_NAME ARG PUBLIC_HOST=localhost ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 \ DOTNET_NOLOGO=1 WORKDIR /src COPY . . # 编译(不依赖 PUBLIC_HOST,可复用构建缓存) RUN dotnet publish "${PROJECT}" -c Release -o /out --nologo # 部署配置覆盖 + 对外地址替换(单独一层:日后只改地址可秒级重建,无需重编译) RUN set -eux; \ # 部署版配置覆盖(各 Host 的 Config/system.json 默认不随发布输出) mkdir -p /out/Config; \ cp "/src/deploy/config/${SVC_NAME}/system.json" /out/Config/system.json; \ cp /src/nlog.config /out/nlog.config; \ # 捕鱼对局层:替换客户端要访问的对外地址 sed -i "s|__PUBLIC_HOST__|${PUBLIC_HOST}|g" /out/Config/system.json; \ # 网关:ocelot 下游地址由 localhost:524x 改写为「容器名:80」 if [ -f /out/ocelot.json ]; then \ sed -i \ -e 's|{ "Host": "localhost", "Port": 5241 }|{ "Host": "0524admin", "Port": 80 }|' \ -e 's|{ "Host": "localhost", "Port": 5245 }|{ "Host": "0524user", "Port": 80 }|' \ -e 's|{ "Host": "localhost", "Port": 5247 }|{ "Host": "0524customer", "Port": 80 }|' \ -e 's|{ "Host": "localhost", "Port": 5242 }|{ "Host": "0524chess", "Port": 80 }|' \ -e 's|{ "Host": "localhost", "Port": 5244 }|{ "Host": "0524fishroom", "Port": 80 }|' \ -e 's|{ "Host": "localhost", "Port": 5248 }|{ "Host": "0524fishgame", "Port": 80 }|' \ /out/ocelot.json; \ fi # ---------- 阶段二:运行时镜像 ---------- FROM ${RUNTIME_IMAGE} ARG APP_DLL ENV APP_DLL=${APP_DLL} \ ASPNETCORE_URLS=http://+:80 \ ASPNETCORE_ENVIRONMENT=Production \ TZ=Asia/Shanghai WORKDIR /app COPY --from=build /out . EXPOSE 80 ENTRYPOINT ["sh", "-c", "exec dotnet ${APP_DLL}"]