improve dockerfile for speed

This commit is contained in:
javad committed 2026-06-16 10:58:18 +03:30
1 parent f89ce457d5
commit 521ee0224b
2 files changed
+34 -26

No files matched your search

+24 -23
View File
@@ -3,52 +3,53 @@
# ========================================== # ==========================================
FROM python:3.11-slim AS builder FROM python:3.11-slim AS builder
ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONDONTWRITEBYTECODE=1 \
ENV PYTHONUNBUFFERED=1 PYTHONUNBUFFERED=1
WORKDIR /app WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends \ # بهینه‌سازی ۱: استفاده از کش سیستم‌عامل برای 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 \ build-essential \
libpq-dev \ libpq-dev
&& rm -rf /var/lib/apt/lists/*
RUN python -m venv /opt/venv RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH" ENV PATH="/opt/venv/bin:$PATH"
COPY requirements.txt . COPY requirements.txt .
#RUN pip install --no-cache-dir -r requirements.txt
RUN pip install --no-cache-dir --default-timeout=1000 -i https://package-mirror.liara.ir/repository/pypi/simple -r requirements.txt # بهینه‌سازی ۲: استفاده از مکانیزم کش BuildKit برای pip (حذف --no-cache-dir)
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 # Stage 2: Final Production Image
# ========================================== # ==========================================
FROM python:3.11-slim FROM python:3.11-slim
ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONDONTWRITEBYTECODE=1 \
ENV PYTHONUNBUFFERED=1 PYTHONUNBUFFERED=1 \
ENV PATH="/opt/venv/bin:$PATH" PATH="/opt/venv/bin:$PATH"
WORKDIR /app WORKDIR /app
# نصب کتابخانه‌های سیستم‌عامل برای زمان اجرا + ابزار ارزشمند supervisor # بهینه‌سازی ۳: انتقال دستور ساخت کاربر به بالاترین نقطه (چون دائم تغییر نمی‌کند)
RUN apt-get update && apt-get install -y --no-install-recommends \ 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 \ libpq5 \
supervisor \ supervisor && \
&& rm -rf /var/lib/apt/lists/* 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 COPY --from=builder /opt/venv /opt/venv
# تمهیدات امنیتی: ساخت کاربر سیستم غیر ریشه
RUN useradd -m -u 1000 django
# ساخت دایرکتوری‌های مورد نیاز و واگذاری مالکیت به کاربر django
RUN mkdir -p /app/staticfiles /app/mediafiles /etc/supervisor && \
chown -R django:django /app /etc/supervisor
RUN mkdir -p /var/log/supervisor && chown -R django:django /var/log/supervisor
# کپی کردن کدهای پروژه با مالکیت کاربر محدود شده # کپی کردن کدهای پروژه با مالکیت کاربر محدود شده
COPY --chown=django:django . . COPY --chown=django:django . .
+10 -3
View File
@@ -1,13 +1,21 @@
[supervisord] [supervisord]
nodaemon=true nodaemon=true
# به جای مسیرهای سیستم، از /tmp استفاده کنید
logfile=/dev/null logfile=/dev/null
pidfile=/tmp/supervisord.pid pidfile=/tmp/supervisord.pid
[unix_http_server]
file=/tmp/supervisor.sock
chmod=0700
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock
[program:django-web] [program:django-web]
command=gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 3 command=gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 3
directory=/app directory=/app
user=django
autostart=true autostart=true
autorestart=true autorestart=true
stdout_logfile=/dev/stdout stdout_logfile=/dev/stdout
@@ -18,7 +26,6 @@ stderr_logfile_maxbytes=0
[program:celery-worker] [program:celery-worker]
command=celery -A config worker -l INFO command=celery -A config worker -l INFO
directory=/app directory=/app
user=django
autostart=true autostart=true
autorestart=true autorestart=true
stdout_logfile=/dev/stdout stdout_logfile=/dev/stdout