Files
I150/srcs/RobotNet10/FleetManager/Dockerfile
2026-07-03 16:37:12 +07:00

78 lines
4.1 KiB
Docker

# 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=<host>;Database=...;User Id=sa;Password=...;TrustServerCertificate=True" \
# -e ConnectionStrings__MapEditorConnection="Server=<host>;Database=...;User Id=sa;Password=...;TrustServerCertificate=True" \
# -e ConnectionStrings__ScriptEngineConnection="Server=<host>;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"]