1
0

Dockerfile 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. # syntax=docker/dockerfile:1.7
  2. # ---------- composer stage ----------
  3. FROM composer:2 AS deps
  4. WORKDIR /app
  5. COPY composer.json composer.lock* ./
  6. RUN composer install --no-dev --no-interaction --no-scripts --no-progress --optimize-autoloader
  7. # ---------- runtime ----------
  8. FROM dunglas/frankenphp:1-php8.3-alpine
  9. ENV PHP_INI_SCAN_DIR=/usr/local/etc/php/conf.d
  10. # System deps for PHP extensions
  11. RUN apk add --no-cache \
  12. icu-dev \
  13. oniguruma-dev \
  14. sqlite-dev \
  15. bash \
  16. && install-php-extensions \
  17. pdo_sqlite \
  18. pdo_mysql \
  19. mbstring \
  20. intl \
  21. opcache \
  22. bcmath
  23. WORKDIR /app
  24. COPY --from=deps /app/vendor ./vendor
  25. COPY . ./
  26. # Caddyfile and entrypoint
  27. COPY docker/Caddyfile /etc/Caddyfile
  28. COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
  29. # SEC_REVIEW F18: drop root. /app stays root-owned and world-readable
  30. # (the runtime only needs to read source); /data is app-owned so the
  31. # SQLite db, attached volume, and `auth:bootstrap-service-token`
  32. # writes succeed without root. /home/app/.{config,local/share} are
  33. # pre-created and owned so FrankenPHP/Caddy XDG state has somewhere
  34. # to land. apk + install-php-extensions still ran above as root
  35. # because they touch /usr/local; no further root-owned work remains.
  36. RUN addgroup -S -g 1000 app \
  37. && adduser -S -u 1000 -G app -h /home/app app \
  38. && chmod +x /usr/local/bin/entrypoint.sh \
  39. && chmod +x bin/console \
  40. && mkdir -p /data /home/app/.config /home/app/.local/share \
  41. && chown -R app:app /data /home/app
  42. ENV XDG_CONFIG_HOME=/home/app/.config \
  43. XDG_DATA_HOME=/home/app/.local/share
  44. USER app
  45. EXPOSE 8081
  46. ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
  47. CMD ["api"]