QuentinL52 commited on
Commit
870427d
·
verified ·
1 Parent(s): 38a021b

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +42 -169
Dockerfile CHANGED
@@ -1,177 +1,50 @@
1
- FROM python:3.11-slim
2
 
3
- # Définir le répertoire de travail
4
- WORKDIR /app
 
 
 
5
 
6
- # Installer les dépendances système nécessaires
7
  RUN apt-get update && apt-get install -y \
8
  build-essential \
9
- curl \
10
- wget \
11
  && rm -rf /var/lib/apt/lists/*
12
 
13
- # Créer un utilisateur non-root
14
- RUN groupadd -r appuser && useradd --no-log-init -r -g appuser -d /app appuser
15
-
16
- # Créer les dossiers de cache et de travail avec les bonnes permissions
17
- RUN mkdir -p /tmp/huggingface_cache && \
18
- mkdir -p /tmp/vector_store && \
19
- mkdir -p /app/knowledge_base && \
20
- mkdir -p /app/cache && \
21
- chown -R appuser:appuser /tmp/huggingface_cache && \
22
- chown -R appuser:appuser /tmp/vector_store && \
23
- chown -R appuser:appuser /app && \
24
- chmod -R 755 /tmp/huggingface_cache && \
25
- chmod -R 755 /tmp/vector_store && \
26
- chmod -R 755 /app
27
-
28
- # Variables d'environnement pour Hugging Face et l'application
29
- ENV HF_HOME=/tmp/huggingface_cache
30
- ENV TRANSFORMERS_CACHE=/tmp/huggingface_cache
31
- ENV SENTENCE_TRANSFORMERS_HOME=/tmp/huggingface_cache
32
- ENV HF_DATASETS_CACHE=/tmp/huggingface_cache
33
- ENV VECTOR_STORE_PATH=/tmp/vector_store
34
- ENV PYTHONPATH=/app
35
- ENV PYTHONUNBUFFERED=1
36
 
37
- # Copier et installer les dépendances
38
  COPY requirements.txt .
39
- RUN pip install --no-cache-dir --upgrade pip && \
40
- pip install --no-cache-dir -r requirements.txt
41
-
42
- # Script de pré-téléchargement du modèle
43
- RUN echo '#!/usr/bin/env python3\n\
44
- import os\n\
45
- import sys\n\
46
- import logging\n\
47
- \n\
48
- # Configuration du logging\n\
49
- logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")\n\
50
- logger = logging.getLogger(__name__)\n\
51
- \n\
52
- def download_model():\n\
53
- """Télécharge le modèle sentence-transformers avec gestion d'\''erreurs."""\n\
54
- try:\n\
55
- # Configuration des variables d'\''environnement\n\
56
- cache_dir = "/tmp/huggingface_cache"\n\
57
- os.makedirs(cache_dir, exist_ok=True)\n\
58
- \n\
59
- os.environ["HF_HOME"] = cache_dir\n\
60
- os.environ["TRANSFORMERS_CACHE"] = cache_dir\n\
61
- os.environ["SENTENCE_TRANSFORMERS_HOME"] = cache_dir\n\
62
- \n\
63
- logger.info("Début du téléchargement du modèle sentence-transformers/all-MiniLM-L6-v2...")\n\
64
- \n\
65
- # Import et téléchargement\n\
66
- from sentence_transformers import SentenceTransformer\n\
67
- model = SentenceTransformer(\n\
68
- "sentence-transformers/all-MiniLM-L6-v2",\n\
69
- cache_folder=cache_dir\n\
70
- )\n\
71
- \n\
72
- logger.info("Modèle téléchargé avec succès!")\n\
73
- \n\
74
- # Test du modèle\n\
75
- logger.info("Test du modèle...")\n\
76
- test_embedding = model.encode(["test sentence"])\n\
77
- logger.info(f"Test réussi - dimension des embeddings: {len(test_embedding[0])}")\n\
78
- \n\
79
- # Vérification de la sauvegarde\n\
80
- model_path = os.path.join(cache_dir, "sentence_transformers_sentence-transformers_all-MiniLM-L6-v2")\n\
81
- if os.path.exists(model_path):\n\
82
- logger.info(f"Modèle sauvegardé dans: {model_path}")\n\
83
- else:\n\
84
- logger.warning("Le modèle ne semble pas avoir été sauvegardé correctement")\n\
85
- \n\
86
- return True\n\
87
- \n\
88
- except ImportError as e:\n\
89
- logger.error(f"Erreur d'\''import: {e}")\n\
90
- return False\n\
91
- except Exception as e:\n\
92
- logger.error(f"Erreur lors du téléchargement: {e}")\n\
93
- return False\n\
94
- \n\
95
- if __name__ == "__main__":\n\
96
- success = download_model()\n\
97
- if success:\n\
98
- logger.info("Pré-téléchargement terminé avec succès")\n\
99
- sys.exit(0)\n\
100
- else:\n\
101
- logger.error("Échec du pré-téléchargement")\n\
102
- sys.exit(1)\n\
103
- ' > /tmp/download_model.py && \
104
- python /tmp/download_model.py
105
-
106
- # Alternative: Téléchargement via HuggingFace CLI (backup)
107
- RUN python -c "
108
- try:
109
- from huggingface_hub import snapshot_download
110
- print('Téléchargement via huggingface_hub en backup...')
111
- snapshot_download(
112
- repo_id='sentence-transformers/all-MiniLM-L6-v2',
113
- cache_dir='/tmp/huggingface_cache',
114
- local_dir='/tmp/huggingface_cache/models--sentence-transformers--all-MiniLM-L6-v2'
115
- )
116
- print('Backup téléchargé avec succès!')
117
- except Exception as e:
118
- print(f'Backup échoué: {e}')
119
- " || echo "Backup download failed, will rely on main download"
120
-
121
- # Vérification que le modèle est bien téléchargé
122
- RUN python -c "
123
- import os
124
- cache_dir = '/tmp/huggingface_cache'
125
- model_files = []
126
- for root, dirs, files in os.walk(cache_dir):
127
- for file in files:
128
- if 'all-MiniLM-L6-v2' in root:
129
- model_files.append(os.path.join(root, file))
130
-
131
- print(f'Fichiers du modèle trouvés: {len(model_files)}')
132
- if model_files:
133
- print('Modèle correctement téléchargé!')
134
- for f in model_files[:5]: # Afficher les 5 premiers fichiers
135
- print(f' - {f}')
136
- if len(model_files) > 5:
137
- print(f' ... et {len(model_files)-5} autres fichiers')
138
- else:
139
- print('ATTENTION: Aucun fichier de modèle trouvé!')
140
- "
141
-
142
- # Copier le code source
143
- COPY --chown=appuser:appuser . .
144
-
145
- # Changer vers l'utilisateur non-root
146
- USER appuser
147
-
148
- # Exposer le port
149
- EXPOSE 8000
150
-
151
- # Test final que tout fonctionne
152
- RUN python -c "
153
- import sys
154
- try:
155
- print('Test final de l\'application...')
156
- # Test import du RAG Handler
157
- from src.rag_handler import RAGHandler
158
- print('✓ RAG Handler importé avec succès')
159
-
160
- # Test du modèle d'embeddings
161
- print('Test du modèle d\'embeddings...')
162
- import os
163
- os.environ['HF_HOME'] = '/tmp/huggingface_cache'
164
-
165
- from sentence_transformers import SentenceTransformer
166
- model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2', cache_folder='/tmp/huggingface_cache')
167
- test_result = model.encode(['test'])
168
- print(f'✓ Modèle fonctionne - dimension: {len(test_result[0])}')
169
-
170
- print('✓ Tous les tests passés!')
171
- except Exception as e:
172
- print(f'✗ Erreur lors des tests: {e}')
173
- sys.exit(1)
174
- "
175
-
176
- # Commande de lancement
177
- CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
 
1
+ FROM python:3.11-slim AS builder
2
 
3
+ ENV PYTHONUNBUFFERED=1 \
4
+ PIP_NO_CACHE_DIR=off \
5
+ PIP_DISABLE_PIP_VERSION_CHECK=on \
6
+ PIP_DEFAULT_TIMEOUT=100 \
7
+ PYTHONDONTWRITEBYTECODE=1
8
 
 
9
  RUN apt-get update && apt-get install -y \
10
  build-essential \
 
 
11
  && rm -rf /var/lib/apt/lists/*
12
 
13
+ RUN pip install uv
14
+
15
+ WORKDIR /app
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
 
17
  COPY requirements.txt .
18
+ RUN uv pip install --system --no-cache -r requirements.txt
19
+
20
+ FROM python:3.11-slim
21
+
22
+ RUN apt-get update && apt-get install -y \
23
+ && rm -rf /var/lib/apt/lists/*
24
+
25
+ WORKDIR /app
26
+
27
+ COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
28
+ COPY --from=builder /usr/local/bin /usr/local/bin
29
+
30
+ COPY . .
31
+
32
+ ENV PORT=8080
33
+ ENV PYTHONPATH=/app
34
+ ENV TRANSFORMERS_CACHE=/tmp/transformers
35
+ ENV HF_HOME=/tmp/hf
36
+ ENV CREW_STORAGE_DIR=/tmp/crew
37
+ ENV HOME=/tmp
38
+ ENV TMPDIR=/tmp
39
+
40
+ RUN mkdir -p /tmp/transformers /tmp/hf /tmp/crew && \
41
+ chmod 777 /tmp/transformers /tmp/hf /tmp/crew
42
+
43
+ RUN addgroup --system app && adduser --system --group app
44
+ RUN chown -R app:app /app /tmp/transformers /tmp/hf
45
+
46
+ USER app
47
+
48
+ EXPOSE $PORT
49
+
50
+ CMD exec uvicorn main:app --host 0.0.0.0 --port $PORT --workers 1