jira-ai-assistant-docker / docker_patch.py
DocUA's picture
run.sh
85fa921
"""
Удосконалений патч для виправлення проблем з правами доступу в 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}")