DocUA commited on
Commit
85fa921
·
1 Parent(s): bb6217a
Files changed (3) hide show
  1. Dockerfile +4 -0
  2. docker_patch.py +67 -60
  3. run.sh +13 -0
Dockerfile CHANGED
@@ -14,9 +14,13 @@ RUN apt-get update && apt-get install -y \
14
  ffmpeg \
15
  libsm6 \
16
  libxext6 \
 
17
  && rm -rf /var/lib/apt/lists/* \
18
  && git lfs install
19
 
 
 
 
20
  # Встановлюємо залежності поетапно
21
  RUN pip install --no-cache-dir --upgrade pip && \
22
  # Базові залежності
 
14
  ffmpeg \
15
  libsm6 \
16
  libxext6 \
17
+ procps \
18
  && rm -rf /var/lib/apt/lists/* \
19
  && git lfs install
20
 
21
+ # Створюємо файл-маркер Docker середовища
22
+ RUN touch /.dockerenv
23
+
24
  # Встановлюємо залежності поетапно
25
  RUN pip install --no-cache-dir --upgrade pip && \
26
  # Базові залежності
docker_patch.py CHANGED
@@ -1,11 +1,5 @@
1
  """
2
- Патч для виправлення проблем з правами доступу в Docker-контейнері HuggingFace Spaces.
3
- Цей файл повинен бути імпортований перед створенням директорій у вашому додатку.
4
-
5
- Використання:
6
- 1. Додайте цей файл до свого репозиторію
7
- 2. Додайте цей імпорт на початку app.py:
8
- import docker_patch
9
  """
10
 
11
  import os
@@ -14,61 +8,74 @@ 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-патч не активований (не в контейнері)")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  """
2
+ Удосконалений патч для виправлення проблем з правами доступу в Docker-контейнері HuggingFace Spaces.
 
 
 
 
 
 
3
  """
4
 
5
  import os
 
8
  from pathlib import Path
9
  import shutil
10
 
11
+ # Перевіряємо, чи в контейнері більш надійним способом
12
+ def check_if_in_container():
13
+ # Метод 1: перевірка наявності файлу /.dockerenv
14
+ if os.path.exists('/.dockerenv'):
15
+ return True
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
+ # Метод 2: перевірка cgroup
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  try:
19
+ with open('/proc/1/cgroup', 'r') as f:
20
+ return 'docker' in f.read() or 'kubepods' in f.read()
21
+ except:
22
+ pass
 
 
23
 
24
+ # Метод 3: перевірка прав запису в поточній директорії
25
+ try:
26
+ test_file = '.docker_test_write'
27
+ with open(test_file, 'w') as f:
28
+ f.write('test')
29
+ os.remove(test_file)
30
+ return False # Якщо можемо писати, то це не Docker або у нас є права
31
+ except:
32
+ # Не можемо писати - швидше за все, це контейнер
33
+ return True
34
 
35
+ return False
36
+
37
+ IN_DOCKER = check_if_in_container()
38
+ print(f"Docker-середовище виявлено: {IN_DOCKER}")
39
+
40
+ # Завжди використовуємо патч для HuggingFace Spaces
41
+ BASE_DIR = "/tmp/jira_assistant"
42
+
43
+ # Створення директорій
44
+ os.makedirs(BASE_DIR, exist_ok=True)
45
+ for directory in ["data", "reports", "temp", "logs"]:
46
+ os.makedirs(os.path.join(BASE_DIR, directory), exist_ok=True)
47
+
48
+ print(f"Директорії створено в {BASE_DIR}")
49
+
50
+ # Патчимо шляхи
51
+ original_mkdir = Path.mkdir
52
+ def patched_mkdir(self, mode=0o777, parents=False, exist_ok=False):
53
+ path_str = str(self)
54
+ if path_str in ['data', 'reports', 'temp', 'logs'] or path_str.startswith(('data/', 'reports/', 'temp/', 'logs/')):
55
+ # Створюємо новий шлях в /tmp
56
+ new_path = Path(os.path.join(BASE_DIR, path_str))
57
+ print(f"Перенаправлення mkdir: {path_str} -> {new_path}")
58
+ return original_mkdir(new_path, mode, parents, exist_ok)
59
 
60
+ # Спроба створити директорію безпосередньо
61
+ try:
62
+ return original_mkdir(self, mode, parents, exist_ok)
63
+ except PermissionError:
64
+ # Якщо немає прав, пробуємо створити в /tmp
65
+ new_path = Path(os.path.join(BASE_DIR, path_str))
66
+ print(f"Перенаправлення mkdir після помилки: {path_str} -> {new_path}")
67
+ return original_mkdir(new_path, mode, parents, exist_ok)
68
+
69
+ # Заміняємо оригінальний метод на наш патч
70
+ Path.mkdir = patched_mkdir
71
+
72
+ # Налаштування логування
73
+ try:
74
+ log_path = os.path.join(BASE_DIR, "logs", "jira_assistant.log")
75
+ log_handler = logging.FileHandler(log_path)
76
+ print(f"Логування встановлено в: {log_path}")
77
+ except Exception as e:
78
+ print(f"Не вдалося створити файл логів: {e}")
79
+ log_handler = logging.StreamHandler()
80
+
81
+ print(f"Docker-патч активовано. Всі операції з файлами будуть перенаправлені в {BASE_DIR}")
run.sh ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ # Підготовка середовища для роботи в HuggingFace Spaces
5
+ mkdir -p /tmp/jira_assistant
6
+ mkdir -p /tmp/jira_assistant/data
7
+ mkdir -p /tmp/jira_assistant/reports
8
+ mkdir -p /tmp/jira_assistant/temp
9
+ mkdir -p /tmp/jira_assistant/logs
10
+ chmod -R 777 /tmp/jira_assistant
11
+
12
+ # Запуск додатку
13
+ exec python app.py