# Build stage / Giai đoạn build FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build WORKDIR /src # EN: Copy project files for layer caching # VI: Sao chép các file project để tận dụng layer caching COPY ["src/MyService.API/MyService.API.csproj", "src/MyService.API/"] COPY ["src/MyService.Domain/MyService.Domain.csproj", "src/MyService.Domain/"] COPY ["src/MyService.Infrastructure/MyService.Infrastructure.csproj", "src/MyService.Infrastructure/"] COPY ["Directory.Build.props", "./"] # EN: Restore dependencies # VI: Khôi phục dependencies RUN dotnet restore "src/MyService.API/MyService.API.csproj" # EN: Copy all source code # VI: Sao chép toàn bộ source code COPY src/ ./src/ # EN: Build the application # VI: Build ứng dụng WORKDIR "/src/src/MyService.API" RUN dotnet build "MyService.API.csproj" -c Release -o /app/build --no-restore # Publish stage / Giai đoạn publish FROM build AS publish RUN dotnet publish "MyService.API.csproj" -c Release -o /app/publish /p:UseAppHost=false --no-restore # Runtime stage / Giai đoạn runtime FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final WORKDIR /app # EN: Create non-root user for security # VI: Tạo user non-root cho bảo mật RUN groupadd -g 1001 dotnetuser && \ useradd -u 1001 -g dotnetuser -s /bin/sh dotnetuser # EN: Copy published application # VI: Sao chép ứng dụng đã publish COPY --from=publish /app/publish . # EN: Change ownership to non-root user # VI: Thay đổi quyền sở hữu sang user non-root RUN chown -R dotnetuser:dotnetuser /app # EN: Switch to non-root user # VI: Chuyển sang user non-root USER dotnetuser # EN: Expose port # VI: Mở cổng EXPOSE 8080 # EN: Set environment variables # VI: Thiết lập biến môi trường ENV ASPNETCORE_URLS=http://+:8080 ENV ASPNETCORE_ENVIRONMENT=Production # EN: Health check # VI: Kiểm tra health HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ CMD curl -f http://localhost:8080/health/live || exit 1 # EN: Start the application # VI: Khởi động ứng dụng ENTRYPOINT ["dotnet", "MyService.API.dll"]