import { useQuery } from "@tanstack/react-query"; import { AlertTriangle, ArrowLeft, CheckCircle, Container, ExternalLink, RefreshCw, Server, } from "lucide-react"; import { Link, useParams } from "react-router-dom"; import api, { formatRelativeTime } from "../../utils/api"; const ContainerDetail = () => { const { id } = useParams(); const { data, isLoading, error } = useQuery({ queryKey: ["docker", "container", id], queryFn: async () => { const response = await api.get(`/docker/containers/${id}`); return response.data; }, refetchInterval: 30000, }); const container = data?.container; const similarContainers = data?.similarContainers || []; if (isLoading) { return (
); } if (error || !container) { return (

Container not found

The container you're looking for doesn't exist or has been removed.

Back to Docker
); } const getStatusBadge = (status) => { const statusClasses = { running: "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200", exited: "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200", paused: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200", restarting: "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200", }; return ( {status} ); }; return (
{/* Header */}
Back to Docker

{container.name}

{getStatusBadge(container.status)}

Container ID: {container.container_id.substring(0, 12)}

{/* Overview Cards */}
{/* Update Status Card */} {container.docker_images?.docker_image_updates && container.docker_images.docker_image_updates.length > 0 ? (

Update Available

{ container.docker_images.docker_image_updates[0] .available_tag }

) : (

Update Status

Up to date

)}

Host

{container.host?.friendly_name || container.host?.hostname}

State

{container.state || container.status}

Last Checked

{formatRelativeTime(container.last_checked)}

{/* Container and Image Information - Side by Side */}
{/* Container Details */}

Container Information

Container ID
{container.container_id}
Image Tag
{container.image_tag}
Created
{formatRelativeTime(container.created_at)}
{container.started_at && (
Started
{formatRelativeTime(container.started_at)}
)} {container.ports && Object.keys(container.ports).length > 0 && (
Port Mappings
{Object.entries(container.ports).map(([key, value]) => ( {key} → {value} ))}
)}
{/* Image Information */} {container.docker_images && (

Image Information

Repository
{container.docker_images.repository}
Tag
{container.docker_images.tag}
Source
{container.docker_images.source}
{container.docker_images.size_bytes && (
Size
{( Number(container.docker_images.size_bytes) / 1024 / 1024 ).toFixed(2)}{" "} MB
)}
Image ID
{container.docker_images.image_id?.substring(0, 12)}...
Created
{formatRelativeTime(container.docker_images.created_at)}
)}
{/* Similar Containers */} {similarContainers.length > 0 && (

Similar Containers (Same Image)

    {similarContainers.map((similar) => (
  • {similar.name}

    {similar.status}

  • ))}
)}
); }; export default ContainerDetail;