Spaces:
Runtime error
Runtime error
""" | |
Удосконалений патч для виправлення проблем з правами доступу в Docker-контейнері HuggingFace Spaces. | |
""" | |
import os | |
import sys | |
import logging | |
from pathlib import Path | |
import shutil | |
# Перевіряємо, чи в контейнері більш надійним способом | |
def check_if_in_container(): | |
# Метод 1: перевірка наявності файлу /.dockerenv | |
if os.path.exists('/.dockerenv'): | |
return True | |
# Метод 2: перевірка cgroup | |
try: | |
with open('/proc/1/cgroup', 'r') as f: | |
return 'docker' in f.read() or 'kubepods' in f.read() | |
except: | |
pass | |
# Метод 3: перевірка прав запису в поточній директорії | |
try: | |
test_file = '.docker_test_write' | |
with open(test_file, 'w') as f: | |
f.write('test') | |
os.remove(test_file) | |
return False # Якщо можемо писати, то це не Docker або у нас є права | |
except: | |
# Не можемо писати - швидше за все, це контейнер | |
return True | |
return False | |
IN_DOCKER = check_if_in_container() | |
print(f"Docker-середовище виявлено: {IN_DOCKER}") | |
# Завжди використовуємо патч для HuggingFace Spaces | |
BASE_DIR = "/tmp/jira_assistant" | |
# Створення директорій | |
os.makedirs(BASE_DIR, exist_ok=True) | |
for directory in ["data", "reports", "temp", "logs"]: | |
os.makedirs(os.path.join(BASE_DIR, directory), exist_ok=True) | |
print(f"Директорії створено в {BASE_DIR}") | |
# Патчимо шляхи | |
original_mkdir = Path.mkdir | |
def patched_mkdir(self, mode=0o777, parents=False, exist_ok=False): | |
path_str = str(self) | |
if path_str in ['data', 'reports', 'temp', 'logs'] or path_str.startswith(('data/', 'reports/', 'temp/', 'logs/')): | |
# Створюємо новий шлях в /tmp | |
new_path = Path(os.path.join(BASE_DIR, path_str)) | |
print(f"Перенаправлення mkdir: {path_str} -> {new_path}") | |
return original_mkdir(new_path, mode, parents, exist_ok) | |
# Спроба створити директорію безпосередньо | |
try: | |
return original_mkdir(self, mode, parents, exist_ok) | |
except PermissionError: | |
# Якщо немає прав, пробуємо створити в /tmp | |
new_path = Path(os.path.join(BASE_DIR, path_str)) | |
print(f"Перенаправлення mkdir після помилки: {path_str} -> {new_path}") | |
return original_mkdir(new_path, mode, parents, exist_ok) | |
# Заміняємо оригінальний метод на наш патч | |
Path.mkdir = patched_mkdir | |
# Налаштування логування | |
try: | |
log_path = os.path.join(BASE_DIR, "logs", "jira_assistant.log") | |
log_handler = logging.FileHandler(log_path) | |
print(f"Логування встановлено в: {log_path}") | |
except Exception as e: | |
print(f"Не вдалося створити файл логів: {e}") | |
log_handler = logging.StreamHandler() | |
print(f"Docker-патч активовано. Всі операції з файлами будуть перенаправлені в {BASE_DIR}") |