# syntax=docker/dockerfile:1 # ===================================================================== # RobotNet10.FleetManager - Multi-stage Docker Build # # Build context: srcs/RobotNet10/ # Build command (run from srcs/RobotNet10/): # docker build -f FleetManager/Dockerfile -t robotnet10-fleet-manager:latest . # # Run example: # docker run -d -p 8080:8080 \ # -e ConnectionStrings__DefaultConnection="Server=;Database=...;User Id=sa;Password=...;TrustServerCertificate=True" \ # -e ConnectionStrings__MapEditorConnection="Server=;Database=...;User Id=sa;Password=...;TrustServerCertificate=True" \ # -e ConnectionStrings__ScriptEngineConnection="Server=;Database=...;User Id=sa;Password=...;TrustServerCertificate=True" \ # --name fleet-manager \ # robotnet10-fleet-manager:latest # ===================================================================== # ===================================================================== # Stage 1: Build # - Uses the full .NET SDK to restore, build, and publish # ===================================================================== FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build WORKDIR /src # Copy toàn bộ source (build context = srcs/RobotNet10/) COPY . . # Restore NuGet packages cho main project (bao gồm tất cả dependencies) RUN dotnet restore FleetManager/RobotNet10.FleetManager/RobotNet10.FleetManager.csproj # Publish Release build RUN dotnet publish FleetManager/RobotNet10.FleetManager/RobotNet10.FleetManager.csproj \ -c Release \ -o /app/publish \ --no-restore # ─── Chuẩn bị thư mục DLL cho ScriptEngine ─────────────────────────── # ScriptEngine cần các DLL này để thực thi dynamic script lúc runtime. # Trong Release mode, #if DEBUG block không chạy nên phải copy thủ công. RUN mkdir -p /app/publish/bin/dlls && \ # Tìm thư mục .NET Core runtime trong SDK image CORE_DIR=$(find /usr/share/dotnet/shared/Microsoft.NETCore.App -maxdepth 1 -mindepth 1 -type d | sort -V | tail -1) && \ echo "Using .NET Core runtime from: $CORE_DIR" && \ cp "$CORE_DIR/System.Private.CoreLib.dll" /app/publish/bin/dlls/ && \ cp "$CORE_DIR/System.Runtime.dll" /app/publish/bin/dlls/ && \ cp "$CORE_DIR/System.Linq.Expressions.dll" /app/publish/bin/dlls/ && \ # Copy các DLL đặc thù của project (đã có trong publish output) cp /app/publish/RobotNet10.Script.dll /app/publish/bin/dlls/ 2>/dev/null || echo "RobotNet10.Script.dll not found (optional)" && \ cp /app/publish/RobotNet10.FleetManager.Script.dll /app/publish/bin/dlls/ 2>/dev/null || echo "RobotNet10.FleetManager.Script.dll not found (optional)" # ===================================================================== # Stage 2: Runtime # - Chỉ chứa ASP.NET Core runtime, không có SDK (image nhỏ hơn) # ===================================================================== FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final WORKDIR /app # Tạo thư mục logs (NLog ghi log vào đây theo nlog.config) RUN mkdir -p logs # Copy toàn bộ published output từ build stage COPY --from=build /app/publish . # ─── Environment Variables mặc định ────────────────────────────────── # Có thể override khi chạy container bằng -e hoặc docker-compose # ASP.NET Core lắng nghe HTTP trên 8080 và HTTPS trên 8081 ENV ASPNETCORE_HTTP_PORTS=8080 ENV ASPNETCORE_HTTPS_PORTS=8081 ENV ASPNETCORE_ENVIRONMENT=Production # ─── Port ───────────────────────────────────────────────────────────── EXPOSE 8080 EXPOSE 8081 # ─── Entrypoint ─────────────────────────────────────────────────────── ENTRYPOINT ["dotnet", "RobotNet10.FleetManager.dll"]