# Dockerfile | |
# Bước 1: Chọn base image | |
# Sử dụng Miniconda làm base. Image này đã bao gồm Conda. | |
FROM continuumio/miniconda3:latest | |
# Thiết lập biến môi trường để tránh các prompt tương tác không cần thiết | |
# trong quá trình cài đặt các package (thường dùng cho các lệnh apt-get, nhưng để đây cũng không sao) | |
ENV DEBIAN_FRONTEND=noninteractive | |
# Bước 2: Thiết lập thư mục làm việc bên trong container | |
WORKDIR /app | |
# Bước 3: Sao chép file định nghĩa môi trường Conda | |
# File environment.yml này nên được đặt cùng cấp với Dockerfile trong repo của bạn. | |
COPY environment.yml . | |
# Cập nhật conda lên phiên bản mới nhất | |
RUN conda update -n base -c defaults conda -y | |
# Bước 4: Tạo môi trường Conda từ file environment.yml | |
# Thay "myapp-env" bằng tên môi trường bạn đã đặt trong environment.yml nếu khác. | |
# Thêm --force để đảm bảo ghi đè môi trường cũ nếu có (hữu ích khi build lại). | |
RUN conda env create -f environment.yml && \ | |
# Dọn dẹp cache của Conda để giảm kích thước image cuối cùng | |
conda clean -afy | |
# Bước 5: Kích hoạt môi trường Conda cho tất cả các lệnh RUN, CMD, ENTRYPOINT tiếp theo | |
# Tên môi trường "myapp-env" phải khớp với tên trong environment.yml | |
SHELL ["conda", "run", "-n", "myapp-env", "/bin/bash", "-c"] | |
# Bước 6: Cài đặt PyTorch, torchvision, torchaudio với GPU bằng pip và index URL cụ thể | |
# QUAN TRỌNG: XÁC MINH LẠI URL VÀ HẬU TỐ CUDA (ví dụ: `cu121` thay vì `cu126` nếu đó là chuẩn). | |
# URL bạn cung cấp: --index-url https://download.pytorch.org/whl/cu126 | |
# Lệnh này sẽ tìm các wheel phù hợp với Python và kiến trúc trên index đó. | |
RUN echo "Bắt đầu cài đặt PyTorch, torchvision, torchaudio với GPU..." && \ | |
pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126 && \ | |
echo "Đã cài đặt PyTorch, torchvision, torchaudio." | |
# Bước 7: Bước xác thực cài đặt (RẤT QUAN TRỌNG để gỡ lỗi trên Spaces) | |
# Bước này sẽ in ra thông tin về môi trường, giúp bạn kiểm tra xem mọi thứ có đúng không. | |
RUN echo "--- KIỂM TRA MÔI TRƯỜNG SAU KHI CÀI ĐẶT ---" && \ | |
echo "Đường dẫn Conda:" && which conda && \ | |
echo "Đường dẫn Python:" && which python && \ | |
echo "Phiên bản Python:" && python --version && \ | |
echo "--- Thông tin PyTorch: ---" && \ | |
python -c "import torch; print(f'PyTorch version: {torch.__version__}'); print(f'CUDA available for PyTorch: {torch.cuda.is_available()}'); print(f'PyTorch built with CUDA version: {torch.version.cuda if torch.cuda.is_available() else 'N/A'}'); print(f'cuDNN version: {torch.backends.cudnn.version() if torch.cuda.is_available() and torch.backends.cudnn.is_available() else 'N/A'}'); print(f'Number of GPUs available to PyTorch: {torch.cuda.device_count()}')" && \ | |
echo "--- Thông tin Faiss: ---" && \ | |
python -c "import faiss; print(f'Faiss version: {faiss.__version__}'); print(f'Number of GPUs available to Faiss: {faiss.get_num_gpus()}')" && \ | |
echo "--- Danh sách một số gói pip quan trọng: ---" && \ | |
pip list | grep -E 'gradio|torch|faiss|unsloth|sentence-transformers|transformers|numpy|rank_bm25|huggingface_hub' && \ | |
echo "--- KẾT THÚC KIỂM TRA MÔI TRƯỜNG ---" | |
# Bước 8: Sao chép toàn bộ code ứng dụng của bạn (app.py, retrieval.py, v.v.) | |
# và các thư mục con (data/, models/ - nếu bạn tải model lên trực tiếp) | |
# vào thư mục /app bên trong container. | |
# Hãy tạo file .dockerignore để loại bỏ các file không cần thiết (ví dụ: .git, __pycache__, .venv) | |
COPY . . | |
# Bước 9: (Tùy chọn) Thiết lập các biến môi trường mà ứng dụng của bạn có thể cần | |
# Ví dụ: | |
# ENV MY_VARIABLE="my_value" | |
# ENV GRADIO_SERVER_NAME="0.0.0.0" # Thường Gradio tự xử lý | |
# ENV GRADIO_SERVER_PORT="7860" # Thường Gradio tự xử lý | |
# Bước 10: Thiết lập lệnh mặc định để chạy ứng dụng của bạn | |
# Điều này giả định rằng app.py của bạn khởi chạy server Gradio. | |
CMD ["python", "app.py"] |