""" API endpoints для управления Docker образами Автор: Сергей Антропов Сайт: https://devops.org.ru """ from fastapi import APIRouter, Request, HTTPException from fastapi.responses import HTMLResponse, JSONResponse from fastapi.templating import Jinja2Templates from pathlib import Path from typing import List, Dict from app.core.config import settings from app.core.docker_client import DockerClient router = APIRouter() templates_path = Path(__file__).parent.parent.parent.parent / "templates" templates = Jinja2Templates(directory=str(templates_path)) def get_docker_client(): """Получение Docker клиента с обработкой ошибок""" try: return DockerClient() except Exception: return None @router.get("/docker", response_class=HTMLResponse) async def docker_page(request: Request): """Страница управления Docker образами""" docker_client = get_docker_client() images = [] if docker_client: try: images = docker_client.list_images() except Exception: pass return templates.TemplateResponse( "pages/docker/index.html", { "request": request, "images": images } ) @router.get("/api/v1/docker/images", response_class=HTMLResponse) async def get_docker_images(): """API endpoint для получения списка Docker образов""" docker_client = get_docker_client() if not docker_client: return """
Docker недоступен
Убедитесь, что Docker запущен и доступен. Проверьте, что Docker socket доступен: /var/run/docker.sock
""" try: images = docker_client.list_images() if not images: return """

Docker образы не найдены

""" html = '
' for img in images: size_mb = (img.get("size", 0) / 1024 / 1024) if img.get("size") else 0 size_str = f"{size_mb:.2f} MB" if size_mb > 0 else "N/A" tags_list = img.get("tags", []) if tags_list: tags = " ".join([f'{tag}' for tag in tags_list]) else: tags = 'нет тегов' img_id = img.get("id", "")[:12] if img.get("id") else "N/A" created = img.get("created", "") if created: try: # Парсим ISO формат даты или timestamp from datetime import datetime if isinstance(created, (int, float)): # Unix timestamp dt = datetime.fromtimestamp(created) created_str = dt.strftime('%d.%m.%Y %H:%M') elif isinstance(created, str): # ISO формат try: dt = datetime.fromisoformat(created.replace('Z', '+00:00')) except: # Пробуем другой формат dt = datetime.strptime(created.split('.')[0], '%Y-%m-%dT%H:%M:%S') created_str = dt.strftime('%d.%m.%Y %H:%M') else: created_str = str(created) except Exception as e: created_str = str(created) else: created_str = "N/A" html += f'' html += '
IDТегиРазмерСоздан
{img_id}{tags}{size_str}{created_str}
' return html except Exception as e: return f"""
Ошибка при получении списка образов: {str(e)}
"""