jira-ai-assistant-docker / docker_patch.py
DocUA's picture
docker_patch.py
bb6217a
raw
history blame
3.17 kB
"""
Патч для виправлення проблем з правами доступу в Docker-контейнері HuggingFace Spaces.
Цей файл повинен бути імпортований перед створенням директорій у вашому додатку.
Використання:
1. Додайте цей файл до свого репозиторію
2. Додайте цей імпорт на початку app.py:
import docker_patch
"""
import os
import sys
import logging
from pathlib import Path
import shutil
# Перевіряємо, чи в контейнері
IN_DOCKER = os.path.exists('/.dockerenv')
if IN_DOCKER:
# Базові шляхи для Docker
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)
# Патчимо шляхи
original_mkdir = Path.mkdir
def patched_mkdir(self, mode=0o777, parents=False, exist_ok=False):
# Якщо шлях вказаний відносно, змінюємо його на шлях в /tmp
if str(self).startswith(('data', 'reports', 'temp', 'logs')):
# Створюємо новий шлях в /tmp
new_path = Path(os.path.join(BASE_DIR, str(self)))
return original_mkdir(new_path, mode, parents, exist_ok)
return original_mkdir(self, mode, parents, exist_ok)
# Заміняємо оригінальний метод на наш патч
Path.mkdir = patched_mkdir
# Патчимо os.path.join
original_join = os.path.join
def patched_join(*args):
result = original_join(*args)
if isinstance(result, str) and result.startswith(('data/', 'reports/', 'temp/', 'logs/')):
return original_join(BASE_DIR, result)
return result
# Заміняємо функцію
os.path.join = patched_join
# Налаштування логування
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()
# Перевизначаємо оригінальні функції для роботи з файлами
original_open = open
def patched_open(file, *args, **kwargs):
if isinstance(file, str) and file.startswith(('data/', 'reports/', 'temp/', 'logs/')):
file = os.path.join(BASE_DIR, file)
return original_open(file, *args, **kwargs)
# Заміняємо функцію
open = patched_open
print(f"Docker-патч активовано. Всі операції з файлами будуть перенаправлені в {BASE_DIR}")
else:
print("Docker-патч не активований (не в контейнері)")