Update Dockerfile to enhance runtime configuration and health check
- 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:
@@ -0,0 +1 @@
|
|||||||
|
*.sh text eol=lf
|
||||||
+8
-7
@@ -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"]
|
||||||
|
|||||||
@@ -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 "$@"
|
||||||
Reference in New Issue
Block a user