# ================================================================= # STAGE 1: BUILDER - Stage để cài đặt các dependencies nặng # ================================================================= FROM python:3.10 as builder # Cập nhật và cài đặt các gói hệ thống cho việc build RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Tạo và kích hoạt venv RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # Sao chép file requirements trước để tận dụng Docker layer caching COPY requirements.txt . # Cài đặt thư viện Python RUN pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir -r requirements.txt # ================================================================= # STAGE 2: FINAL - Stage cuối cùng, nhỏ gọn để chạy ứng dụng # ================================================================= FROM python:3.10-slim # Cài đặt chỉ các dependencies hệ thống cần thiết cho RUNTIME RUN apt-get update && apt-get install -y --no-install-recommends \ poppler-utils \ libgl1-mesa-glx \ libglib2.0-0 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Sao chép môi trường ảo từ stage builder COPY --from=builder /opt/venv /opt/venv # Kích hoạt virtual environment ENV PATH="/opt/venv/bin:$PATH" # --- PHẦN SỬA ĐỔI QUAN TRỌNG --- # Thiết lập các biến môi trường quan trọng # 1. **SỬA LẠI ĐÂY**: Trỏ thư mục cache vào /tmp, nơi ứng dụng có quyền ghi # Điều này sẽ sửa lỗi "Permission denied" ENV HF_HOME=/tmp/huggingface_cache ENV SENTENCE_TRANSFORMERS_HOME=/tmp/huggingface_cache # 2. Tạo thư mục cache và cấp quyền (thực hành tốt) RUN mkdir -p /tmp/huggingface_cache && chmod 777 /tmp/huggingface_cache # 3. Các biến môi trường khác giữ nguyên ENV HF_HUB_DISABLE_SYMLINKS_WARNING=1 ENV PYTHONUNBUFFERED=1 # --- KẾT THÚC PHẦN SỬA ĐỔI --- # Sao chép toàn bộ mã nguồn của ứng dụng COPY . . # Tải trước (pre-download/bake) các model vào trong image # Bây giờ các model sẽ được lưu vào /tmp/huggingface_cache bên trong image RUN python -c "from sentence_transformers import SentenceTransformer; SentenceTransformer('bkai-foundation-models/vietnamese-bi-encoder')" RUN python -c "from langchain_community.cross_encoders import HuggingFaceCrossEncoder; HuggingFaceCrossEncoder(model_name='cross-encoder/ms-marco-MiniLM-L-6-v2')" # Mở cổng EXPOSE 7860 # Lệnh chạy ứng dụng CMD ["gunicorn", "-w", "2", "-k", "uvicorn.workers.UvicornWorker", "main:app", "--bind", "0.0.0.0:7860", "--timeout", "120"]