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

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +157 -19
Dockerfile CHANGED
@@ -1,39 +1,177 @@
1
- # Utiliser une image Python 3.11 moderne
2
  FROM python:3.11-slim
3
 
4
  # Définir le répertoire de travail
5
  WORKDIR /app
6
 
7
- # Créer un utilisateur non-root pour des raisons de sécurité et de permissions
 
 
 
 
 
 
 
8
  RUN groupadd -r appuser && useradd --no-log-init -r -g appuser -d /app appuser
9
 
10
- # Créer les dossiers de cache nécessaires avec les bonnes permissions
11
- RUN mkdir -p /app/cache/hub && \
12
- mkdir -p /app/cache/models && \
13
- mkdir -p /tmp/huggingface_cache && \
14
- chown -R appuser:appuser /app/cache && \
15
  chown -R appuser:appuser /tmp/huggingface_cache && \
16
- chmod -R 755 /app/cache && \
17
- chmod -R 755 /tmp/huggingface_cache
 
 
 
18
 
19
- # Variables d'environnement pour Hugging Face
20
- ENV HF_HOME=/app/cache
21
- ENV TRANSFORMERS_CACHE=/app/cache/models
22
- ENV HF_DATASETS_CACHE=/app/cache/datasets
23
- ENV SENTENCE_TRANSFORMERS_HOME=/app/cache/sentence_transformers
 
 
 
24
 
25
- # Copier les dépendances et les installer
26
  COPY requirements.txt .
27
- RUN pip install --no-cache-dir -r requirements.txt
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
29
- # Copier le reste du code et donner les permissions
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  COPY --chown=appuser:appuser . .
31
 
32
- # Changer pour l'utilisateur non-root
33
  USER appuser
34
 
35
- # Exposer le port de l'API
36
  EXPOSE 8000
37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  # Commande de lancement
39
  CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
 
 
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"]