# ========================================== # Stage 1: Build dependencies # ========================================== FROM python:3.11-slim AS builder ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 WORKDIR /app # استفاده از کش سیستم‌عامل برای 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 \ build-essential \ libpq-dev RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" COPY requirements.txt . # استفاده از مکانیزم کش 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 # ========================================== # Stage 2: Final Production Image # ========================================== FROM python:3.11-slim ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PATH="/opt/venv/bin:$PATH" WORKDIR /app # ساخت کاربر سیستم غیر ریشه در بالاترین بخش ممکن برای حفظ کش RUN useradd -m -u 1000 django # استفاده از کش 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 \ libpq5 \ supervisor && \ mkdir -p /app/staticfiles /app/mediafiles /etc/supervisor /var/log/supervisor && \ chown -R django:django /app /etc/supervisor /var/log/supervisor # کپی کردن و واگذاری مالکیت لایه پاکیزه پکیج‌ها به کاربر 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 . . # سوئیچ به کاربر غیر ریشه USER django # اکسپوز پورت وب‌سرور برای وب‌پروکسی Coolify EXPOSE 8000 # نقطه ورود اصلی کانتینر ENTRYPOINT ["/app/entrypoint.sh"]