Update Dockerfile to enhance runtime configuration and health check
CI / Backend (build + test) (push) Successful in 1m19s
CI / Frontend (lint + typecheck + build) (push) Successful in 33s

- Added `gosu` for safe privilege dropping in the entrypoint script.
- Updated the entrypoint to use `docker-entrypoint.sh` for improved container management.
- Ensured necessary directories are created with appropriate permissions during the build process.
- Enhanced health check command to verify service availability more reliably.
This commit is contained in:
Leonid Pershin
2026-07-15 16:02:36 +03:00
parent d30c958dc4
commit 68781ef183
3 changed files with 19 additions and 7 deletions
+1
View File
@@ -0,0 +1 @@
*.sh text eol=lf
+8 -7
View File
@@ -30,17 +30,18 @@ RUN dotnet publish backend/src/PnvPanel.Api/PnvPanel.Api.csproj -c Release -o /a
# ── Stage 3: runtime ────────────────────────────────────────────────────── # ── Stage 3: runtime ──────────────────────────────────────────────────────
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
WORKDIR /app WORKDIR /app
# curl — только для HEALTHCHECK в docker-compose (GET /health), в образе его нет по умолчанию. # curl — HEALTHCHECK (GET /health). gosu — безопасный drop-privileges из entrypoint: контейнер
RUN apt-get update && apt-get install -y --no-install-recommends curl \ # стартует под root, чтобы почистить владельца смонтированных volume'ов, и тут же передаёт
# управление непривилегированному пользователю (см. docker-entrypoint.sh).
RUN apt-get update && apt-get install -y --no-install-recommends curl gosu \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
ENV ASPNETCORE_ENVIRONMENT=Production \ ENV ASPNETCORE_ENVIRONMENT=Production \
ASPNETCORE_HTTP_PORTS=8080 ASPNETCORE_HTTP_PORTS=8080
EXPOSE 8080 EXPOSE 8080
COPY --from=backend /app/publish ./ COPY --from=backend /app/publish ./
# Data Protection key-ring и загрузки тикетов монтируются сюда volume'ами (см. docker-compose.yml). COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
# Готовим права заранее — Docker скопирует владельца/содержимое в volume при первом маунте (copy-up). RUN chmod +x /usr/local/bin/docker-entrypoint.sh && mkdir -p /app/keys /app/uploads
RUN mkdir -p /app/keys /app/uploads && chown -R app:app /app/keys /app/uploads
USER app
HEALTHCHECK --interval=15s --timeout=5s --start-period=20s --retries=5 \ HEALTHCHECK --interval=15s --timeout=5s --start-period=20s --retries=5 \
CMD curl -f http://localhost:8080/health || exit 1 CMD curl -f http://localhost:8080/health || exit 1
ENTRYPOINT ["dotnet", "PnvPanel.Api.dll"] ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["dotnet", "PnvPanel.Api.dll"]
+10
View File
@@ -0,0 +1,10 @@
#!/bin/sh
set -e
# Именованные volume'ы (/app/keys, /app/uploads) на уже существующих деплоях могли остаться
# root-owned (Docker copy-up переносит владельца из образа только для НОВОЙ пустой volume).
# Контейнер поэтому стартует под root и сам чинит владельца при каждом запуске, только
# после этого передаёт управление непривилегированному app-пользователю через gosu.
chown -R app:app /app/keys /app/uploads
exec gosu app "$@"