diff --git a/Dockerfile b/Dockerfile index 1ac0bc7..aa74829 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ ENV PYTHONDONTWRITEBYTECODE=1 \ WORKDIR /app -# بهینه‌سازی ۱: استفاده از کش سیستم‌عامل برای apt +# استفاده از کش سیستم‌عامل برای apt RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ apt-get update && apt-get install -y --no-install-recommends \ @@ -20,7 +20,7 @@ ENV PATH="/opt/venv/bin:$PATH" COPY requirements.txt . -# بهینه‌سازی ۲: استفاده از مکانیزم کش BuildKit برای pip (حذف --no-cache-dir) +# استفاده از مکانیزم کش BuildKit برای pip RUN --mount=type=cache,target=/root/.cache/pip \ pip install --default-timeout=1000 -i https://package-mirror.liara.ir/repository/pypi/simple -r requirements.txt @@ -35,10 +35,10 @@ ENV PYTHONDONTWRITEBYTECODE=1 \ WORKDIR /app -# بهینه‌سازی ۳: انتقال دستور ساخت کاربر به بالاترین نقطه (چون دائم تغییر نمی‌کند) +# ساخت کاربر سیستم غیر ریشه در بالاترین بخش ممکن برای حفظ کش RUN useradd -m -u 1000 django -# بهینه‌سازی ۴: استفاده از کش apt در استیج نهایی و ادغام پوشه‌ها +# استفاده از کش apt و ساخت دایرکتوری‌های مورد نیاز به صورت یکپارچه RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ apt-get update && apt-get install -y --no-install-recommends \ @@ -47,15 +47,16 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ mkdir -p /app/staticfiles /app/mediafiles /etc/supervisor /var/log/supervisor && \ chown -R django:django /app /etc/supervisor /var/log/supervisor -# کپی کردن لایه پاکیزه پکیج‌ها از استیج اول -COPY --from=builder /opt/venv /opt/venv +# کپی کردن و واگذاری مالکیت لایه پاکیزه پکیج‌ها به کاربر django +COPY --from=builder --chown=django:django /opt/venv /opt/venv + +# بهینه‌سازی: کپی جداگانه اینتری‌پوینت برای خراب نشدن کش در تغییرات بعدی کد +COPY --chown=django:django entrypoint.sh /app/entrypoint.sh +RUN chmod +x /app/entrypoint.sh # کپی کردن کدهای پروژه با مالکیت کاربر محدود شده COPY --chown=django:django . . -# اجرایی کردن اسکریپت اینتری‌پوینت -RUN chmod +x /app/entrypoint.sh - # سوئیچ به کاربر غیر ریشه USER django diff --git a/entrypoint.sh b/entrypoint.sh index cf0d86d..2f44860 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -3,12 +3,14 @@ # متوقف کردن اسکریپت در صورت بروز هرگونه خطا در مراحل آماده‌سازی set -e +echo "==> Collecting Static Files..." +# ۱. انتقال به ابتدای اسکریپت +python manage.py collectstatic --noinput --clear + echo "==> Running Database Migrations..." +# ۲. این دستور معمولاً باید بعد از استاتیک‌فایل‌ها یا در مرحله‌ای مجزا اجرا شود python manage.py migrate --noinput -echo "==> Collecting Static Files..." -python manage.py collectstatic --noinput - echo "==> Starting Supervisor..." -# اجرای سوپروایزر به عنوان پروسه اصلی (PID 1) کانتینر +# اجرای سوپروایزر با آدرس دقیق کانفیگ به عنوان پروسه اصلی exec supervisord -c /etc/supervisor/supervisord.conf \ No newline at end of file