From 042644165fee2d74423dcd0bb818a2b91b9b6584 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 13 Apr 2026 23:47:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20?= =?UTF-8?q?=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE?= =?UTF-8?q?=20Docker-=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=B9=D0=BD=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bash/README.md | 0 bash/docker_info.sh | 44 +++++++++++++++++++++++++++++--------------- 2 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 bash/README.md diff --git a/bash/README.md b/bash/README.md new file mode 100644 index 0000000..e69de29 diff --git a/bash/docker_info.sh b/bash/docker_info.sh index d548210..ccf4f12 100644 --- a/bash/docker_info.sh +++ b/bash/docker_info.sh @@ -2,7 +2,7 @@ # ============================================================================== # Скрипт: docker_info.sh # Описание: Выводит подробную информацию о запущенных Docker-контейнерах, -# включая их порты, IP-адреса и физическое расположение данных (Mounts). +# включая порты, IP, физическое расположение данных и потребление ресурсов (CPU/RAM). # ============================================================================== set -e @@ -12,7 +12,8 @@ BLUE='\033[1;34m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' -NC='\033[0m' # Сброс цвета +MAGENTA='\033[1;35m' # Добавили новый цвет для ресурсов +NC='\033[0m' echo -e "${BLUE}=== Анализ запущенных Docker контейнеров ===${NC}\n" @@ -30,44 +31,57 @@ if [ -z "$CONTAINERS" ]; then exit 0 fi -# Перебираем каждый контейнер и вытаскиваем нужную информацию +echo -e "${YELLOW}Собираю данные о потреблении ресурсов (это займет 1-2 секунды)...${NC}\n" + +# Делаем моментальный снимок ресурсов (без непрерывного потока) для всех контейнеров сразу +# Формат: ID|CPU|RAM +STATS=$(docker stats --no-stream --format "{{.ID}}|{{.CPUPerc}}|{{.MemUsage}}") + +# Перебираем каждый контейнер for CONTAINER_ID in $CONTAINERS; do - # Используем docker inspect для точечного извлечения данных + # Базовая информация NAME=$(docker inspect --format '{{.Name}}' "$CONTAINER_ID" | sed 's/\///') IMAGE=$(docker inspect --format '{{.Config.Image}}' "$CONTAINER_ID") STATE=$(docker inspect --format '{{.State.Status}}' "$CONTAINER_ID") - STARTED=$(docker inspect --format '{{.State.StartedAt}}' "$CONTAINER_ID" | cut -d'.' -f1 | tr 'T' ' ') IP=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$CONTAINER_ID") PORTS=$(docker ps --filter "id=$CONTAINER_ID" --format "{{.Ports}}") - echo -e "${CYAN}📦 Контейнер:${NC} ${GREEN}$NAME${NC} (ID: ${CONTAINER_ID:0:12})" - echo -e " ├─ ${YELLOW}Образ:${NC} $IMAGE" - echo -e " ├─ ${YELLOW}Статус:${NC} $STATE (Запущен: $STARTED)" + # Вытаскиваем ресурсы именно для текущего контейнера из нашего снимка + # Ищем строку, которая начинается с ID текущего контейнера + CONTAINER_STAT=$(echo "$STATS" | grep "^${CONTAINER_ID}") + CPU_USAGE=$(echo "$CONTAINER_STAT" | cut -d'|' -f2) + MEM_USAGE=$(echo "$CONTAINER_STAT" | cut -d'|' -f3) - # Обрабатываем IP, если он пустой (например, если используется сеть host) + echo -e "${CYAN}📦 Контейнер:${NC} ${GREEN}$NAME${NC} (ID: ${CONTAINER_ID:0:12})" + echo -e " ├─ ${YELLOW}Образ:${NC} $IMAGE" + echo -e " ├─ ${YELLOW}Статус:${NC} $STATE" + + # Выводим потребление ресурсов + echo -e " ├─ ${MAGENTA}Ресурсы:${NC} CPU: ${CPU_USAGE:-0.00%} | RAM: ${MEM_USAGE:-0B / 0B}" + + # Обрабатываем IP if [ -z "$IP" ]; then IP="Не назначен (host network?)"; fi - echo -e " ├─ ${YELLOW}Сеть:${NC} IP: $IP" + echo -e " ├─ ${YELLOW}Сеть:${NC} IP: $IP" # Обрабатываем порты if [ -z "$PORTS" ]; then PORTS="Нет проброшенных портов"; fi - echo -e " ├─ ${YELLOW}Порты:${NC} $PORTS" + echo -e " ├─ ${YELLOW}Порты:${NC} $PORTS" echo -e " └─ ${YELLOW}Расположение данных (Mounts):${NC}" - # Получаем пути, куда примонтированы данные (Host -> Container) + # Получаем пути MOUNTS=$(docker inspect --format '{{range .Mounts}}{{println .Source " -> " .Destination}}{{end}}' "$CONTAINER_ID") if [ -z "$MOUNTS" ]; then - echo -e " ${NC}Данные хранятся только внутри контейнера (нет внешних Mounts)${NC}" + echo -e " ${NC}Данные хранятся только внутри контейнера${NC}" else - # Выводим пути с отступом для красоты echo "$MOUNTS" | while IFS= read -r line; do if [ -n "$line" ]; then echo -e " 📁 $line" fi done fi - echo "" # Пустая строка между контейнерами + echo "" # Пустая строка для красоты done echo -e "${BLUE}=== Анализ завершен ===${NC}" \ No newline at end of file