обавлен скрипт для просмотра информации о Docker-контейнерах

This commit is contained in:
2026-04-13 23:47:41 +03:00
parent 1ee4c616e3
commit 042644165f
2 changed files with 29 additions and 15 deletions

0
bash/README.md Normal file
View File

View File

@@ -2,7 +2,7 @@
# ============================================================================== # ==============================================================================
# Скрипт: docker_info.sh # Скрипт: docker_info.sh
# Описание: Выводит подробную информацию о запущенных Docker-контейнерах, # Описание: Выводит подробную информацию о запущенных Docker-контейнерах,
# включая их порты, IP-адреса и физическое расположение данных (Mounts). # включая порты, IP, физическое расположение данных и потребление ресурсов (CPU/RAM).
# ============================================================================== # ==============================================================================
set -e set -e
@@ -12,7 +12,8 @@ BLUE='\033[1;34m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
CYAN='\033[0;36m' CYAN='\033[0;36m'
NC='\033[0m' # Сброс цвета MAGENTA='\033[1;35m' # Добавили новый цвет для ресурсов
NC='\033[0m'
echo -e "${BLUE}=== Анализ запущенных Docker контейнеров ===${NC}\n" echo -e "${BLUE}=== Анализ запущенных Docker контейнеров ===${NC}\n"
@@ -30,44 +31,57 @@ if [ -z "$CONTAINERS" ]; then
exit 0 exit 0
fi 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 for CONTAINER_ID in $CONTAINERS; do
# Используем docker inspect для точечного извлечения данных # Базовая информация
NAME=$(docker inspect --format '{{.Name}}' "$CONTAINER_ID" | sed 's/\///') NAME=$(docker inspect --format '{{.Name}}' "$CONTAINER_ID" | sed 's/\///')
IMAGE=$(docker inspect --format '{{.Config.Image}}' "$CONTAINER_ID") IMAGE=$(docker inspect --format '{{.Config.Image}}' "$CONTAINER_ID")
STATE=$(docker inspect --format '{{.State.Status}}' "$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") IP=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$CONTAINER_ID")
PORTS=$(docker ps --filter "id=$CONTAINER_ID" --format "{{.Ports}}") 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" # Ищем строку, которая начинается с ID текущего контейнера
echo -e " ├─ ${YELLOW}Статус:${NC} $STATE (Запущен: $STARTED)" 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 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 if [ -z "$PORTS" ]; then PORTS="Нет проброшенных портов"; fi
echo -e " ├─ ${YELLOW}Порты:${NC} $PORTS" echo -e " ├─ ${YELLOW}Порты:${NC} $PORTS"
echo -e " └─ ${YELLOW}Расположение данных (Mounts):${NC}" echo -e " └─ ${YELLOW}Расположение данных (Mounts):${NC}"
# Получаем пути, куда примонтированы данные (Host -> Container) # Получаем пути
MOUNTS=$(docker inspect --format '{{range .Mounts}}{{println .Source " -> " .Destination}}{{end}}' "$CONTAINER_ID") MOUNTS=$(docker inspect --format '{{range .Mounts}}{{println .Source " -> " .Destination}}{{end}}' "$CONTAINER_ID")
if [ -z "$MOUNTS" ]; then if [ -z "$MOUNTS" ]; then
echo -e " ${NC}Данные хранятся только внутри контейнера (нет внешних Mounts)${NC}" echo -e " ${NC}Данные хранятся только внутри контейнера${NC}"
else else
# Выводим пути с отступом для красоты
echo "$MOUNTS" | while IFS= read -r line; do echo "$MOUNTS" | while IFS= read -r line; do
if [ -n "$line" ]; then if [ -n "$line" ]; then
echo -e " 📁 $line" echo -e " 📁 $line"
fi fi
done done
fi fi
echo "" # Пустая строка между контейнерами echo "" # Пустая строка для красоты
done done
echo -e "${BLUE}=== Анализ завершен ===${NC}" echo -e "${BLUE}=== Анализ завершен ===${NC}"