DocUA commited on
Commit
bb6217a
·
1 Parent(s): 0e6eecf

docker_patch.py

Browse files
Files changed (3) hide show
  1. Dockerfile +6 -8
  2. app.py +2 -0
  3. docker_patch.py +74 -0
Dockerfile CHANGED
@@ -27,18 +27,16 @@ RUN pip install --no-cache-dir --upgrade pip && \
27
  # Google Genai, ігноруючи залежність на websockets
28
  pip install --no-build-isolation --no-deps google-genai==0.3.0
29
 
30
- # Експортуємо порт
31
- EXPOSE 7860
32
-
33
-
34
- # Додайте в кінець Dockerfile перед CMD командою:
35
- RUN mkdir -p /tmp/jira_assistant && \
36
  mkdir -p /tmp/jira_assistant/data && \
37
  mkdir -p /tmp/jira_assistant/reports && \
38
  mkdir -p /tmp/jira_assistant/temp && \
39
  mkdir -p /tmp/jira_assistant/logs && \
40
  chmod -R 777 /tmp/jira_assistant
41
 
42
- # Запуск з користувачем без root-прав
43
- USER 1000
 
 
44
  CMD ["python", "app.py"]
 
27
  # Google Genai, ігноруючи залежність на websockets
28
  pip install --no-build-isolation --no-deps google-genai==0.3.0
29
 
30
+ # Створюємо необхідні директорії з повними правами
31
+ RUN mkdir -p /tmp/jira_assistant && \
 
 
 
 
32
  mkdir -p /tmp/jira_assistant/data && \
33
  mkdir -p /tmp/jira_assistant/reports && \
34
  mkdir -p /tmp/jira_assistant/temp && \
35
  mkdir -p /tmp/jira_assistant/logs && \
36
  chmod -R 777 /tmp/jira_assistant
37
 
38
+ # Експортуємо порт
39
+ EXPOSE 7860
40
+
41
+ # Запуск програми
42
  CMD ["python", "app.py"]
app.py CHANGED
@@ -3,6 +3,8 @@ import logging
3
  from pathlib import Path
4
  from datetime import datetime
5
  import traceback
 
 
6
 
7
  # Налаштування логування
8
  logging.basicConfig(
 
3
  from pathlib import Path
4
  from datetime import datetime
5
  import traceback
6
+ import docker_patch
7
+
8
 
9
  # Налаштування логування
10
  logging.basicConfig(
docker_patch.py ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Патч для виправлення проблем з правами доступу в Docker-контейнері HuggingFace Spaces.
3
+ Цей файл повинен бути імпортований перед створенням директорій у вашому додатку.
4
+
5
+ Використання:
6
+ 1. Додайте цей файл до свого репозиторію
7
+ 2. Додайте цей імпорт на початку app.py:
8
+ import docker_patch
9
+ """
10
+
11
+ import os
12
+ import sys
13
+ import logging
14
+ from pathlib import Path
15
+ import shutil
16
+
17
+ # Перевіряємо, чи в контейнері
18
+ IN_DOCKER = os.path.exists('/.dockerenv')
19
+
20
+ if IN_DOCKER:
21
+ # Базові шляхи для Docker
22
+ BASE_DIR = "/tmp/jira_assistant"
23
+
24
+ # Створення директорій
25
+ os.makedirs(BASE_DIR, exist_ok=True)
26
+ for directory in ["data", "reports", "temp", "logs"]:
27
+ os.makedirs(os.path.join(BASE_DIR, directory), exist_ok=True)
28
+
29
+ # Патчимо шляхи
30
+ original_mkdir = Path.mkdir
31
+ def patched_mkdir(self, mode=0o777, parents=False, exist_ok=False):
32
+ # Якщо шлях вказаний відносно, змінюємо його на шлях в /tmp
33
+ if str(self).startswith(('data', 'reports', 'temp', 'logs')):
34
+ # Створюємо новий шлях в /tmp
35
+ new_path = Path(os.path.join(BASE_DIR, str(self)))
36
+ return original_mkdir(new_path, mode, parents, exist_ok)
37
+ return original_mkdir(self, mode, parents, exist_ok)
38
+
39
+ # Заміняємо оригінальний метод на наш патч
40
+ Path.mkdir = patched_mkdir
41
+
42
+ # Патчимо os.path.join
43
+ original_join = os.path.join
44
+ def patched_join(*args):
45
+ result = original_join(*args)
46
+ if isinstance(result, str) and result.startswith(('data/', 'reports/', 'temp/', 'logs/')):
47
+ return original_join(BASE_DIR, result)
48
+ return result
49
+
50
+ # Заміняємо функцію
51
+ os.path.join = patched_join
52
+
53
+ # Налаштування логування
54
+ try:
55
+ log_path = os.path.join(BASE_DIR, "logs", "jira_assistant.log")
56
+ log_handler = logging.FileHandler(log_path)
57
+ print(f"Логування встановлено в: {log_path}")
58
+ except Exception as e:
59
+ print(f"Не вдалося створити файл логів: {e}")
60
+ log_handler = logging.StreamHandler()
61
+
62
+ # Перевизначаємо оригінальні функції для роботи з файлами
63
+ original_open = open
64
+ def patched_open(file, *args, **kwargs):
65
+ if isinstance(file, str) and file.startswith(('data/', 'reports/', 'temp/', 'logs/')):
66
+ file = os.path.join(BASE_DIR, file)
67
+ return original_open(file, *args, **kwargs)
68
+
69
+ # Заміняємо функцію
70
+ open = patched_open
71
+
72
+ print(f"Docker-патч активовано. Всі операції з файлами будуть перенаправлені в {BASE_DIR}")
73
+ else:
74
+ print("Docker-патч не активований (не в контейнері)")