78 lines
4.1 KiB
Docker
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"]
|