# ===== مرحلة بناء Fortran ===== FROM python:3.10-slim as fortran-builder # تثبيت متطلبات بناء Fortran RUN apt-get update && apt-get install -y --no-install-recommends \ gfortran \ liblapack-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /fortran-build # نسخ ملف Fortran COPY src/core/nswe_solver.f90 . # تثبيت numpy واستخدام f2py لبناء مكتبة Fortran RUN pip install --no-cache-dir numpy && \ python -c "import numpy; import numpy.f2py; numpy.f2py.main()" -c nswe_solver.f90 -m nswe_solver # ===== مرحلة بناء Python ===== FROM python:3.10-slim as builder # تثبيت أدوات النظام اللازمة RUN apt-get update && apt-get install -y --no-install-recommends \ gfortran \ liblapack-dev \ gcc \ && rm -rf /var/lib/apt/lists/* WORKDIR /build # نسخ ملفات المتطلبات COPY requirements.txt . COPY requirements-dev.txt . # إنشاء بيئة افتراضية وتثبيت الحزم RUN python -m venv /venv && \ /venv/bin/pip install --upgrade pip && \ /venv/bin/pip install --no-cache-dir wheel && \ /venv/bin/pip install --no-cache-dir -r requirements.txt && \ /venv/bin/pip install --no-cache-dir numpy && \ if [ -f requirements-dev.txt ]; then /venv/bin/pip install --no-cache-dir -r requirements-dev.txt; fi # ===== المرحلة النهائية ===== FROM python:3.10-slim # إنشاء مستخدم غير جذري RUN useradd --create-home --shell /bin/bash tsuwave # تثبيت مكتبات التشغيل اللازمة RUN apt-get update && apt-get install -y --no-install-recommends \ liblapack3 \ libgfortran5 \ curl \ && rm -rf /var/lib/apt/lists/* # نسخ البيئة الافتراضية من مرحلة builder COPY --from=builder --chown=tsuwave:tsuwave /venv /venv # نسخ مكتبة Fortran المبنية COPY --from=fortran-builder --chown=tsuwave:tsuwave /fortran-build/nswe_solver.*.so /app/src/tsuwave/core/ # تعيين متغيرات البيئة ENV PATH="/venv/bin:$PATH" \ PYTHONUNBUFFERED=1 \ PYTHONPATH="/app:$PYTHONPATH" # نسخ ملفات المشروع WORKDIR /app COPY --chown=tsuwave:tsuwave . . # إنشاء المجلدات اللازمة RUN mkdir -p /app/data /app/logs /app/config && \ chown -R tsuwave:tsuwave /app # التبديل إلى المستخدم غير الجذري USER tsuwave # تشغيل Streamlit على المنفذ 7860 (المنفذ الافتراضي لـ Hugging Face) CMD ["streamlit", "run", "src/tsuwave/dashboard/app.py", "--server.port=7860", "--server.address=0.0.0.0"] # المنفذ الذي سيستخدمه التطبيق EXPOSE 7860