Files
khatibi/Dockerfile
T
2026-10-15 11:21:55 +03:30

78 lines
3.5 KiB
Docker

# ==========================================
# Stage 1: Build dependencies
# ==========================================
FROM python:3.11-slim AS builder
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
WORKDIR /app
# تنظیم میرورهای ایرانی لیارا برای مخازن Debian و بهینه‌سازی کش سیستم‌عامل برای apt
RUN sed -i 's|deb.debian.org|linux-mirror.liara.ir/repository|g' /etc/apt/sources.list /etc/apt/sources.list.d/*.sources 2>/dev/null || true
# بهینه‌سازی ۱: استفاده از کش سیستم‌عامل برای 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
# تنظیم میرورهای ایرانی لیارا برای مخازن Debian در ایمیج نهایی
RUN sed -i 's|deb.debian.org|linux-mirror.liara.ir/repository|g' /etc/apt/sources.list /etc/apt/sources.list.d/*.sources 2>/dev/null || true
# بهینه‌سازی ۴: استفاده از کش 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/static /app/sqlite /app/mediafiles /etc/supervisor /var/log/supervisor && \
chown -R django:django /app /app/sqlite /etc/supervisor /var/log/supervisor
# کپی کردن و واگذاری مالکیت محیط مجازی به کاربر django
COPY --from=builder --chown=django:django /opt/venv /opt/venv
# کپی صریح فایل دادهٔ نام‌های ایرانی (پیش‌نیاز دستور fix_customer_names).
# صریح نوشته شده تا حتی اگر context ساخت یا .dockerignore در آینده عوض شود،
# فایل بی‌سروصدا از ایمیج بیرون نیفتد. اگر فایل در context نباشد، build با خطای
# روشن شکست می‌خورد (fail-fast) — بهتر از اجرای دستور روی سرور و خطای «فایل پیدا نشد».
COPY --chown=django:django iranianNamesDataset.json /app/iranianNamesDataset.json
# کپی کردن تمام کدهای پروژه با مالکیت کاربر محدود شده
COPY --chown=django:django . .
# حل مشکل خطای Permission Denied اسکریپت ورود
RUN chmod +x /app/entrypoint.sh
# سوئیچ به کاربر غیر ریشه برای امنیت پروداکشن
USER django
# اکسپوز پورت وب‌سرور برای وب‌پروکسی Coolify
EXPOSE 8000
# نقطه ورود اصلی کانتینر
ENTRYPOINT ["/app/entrypoint.sh"]