Скрипт выводит сводку по Docker при каждом входе по SSH: список контейнеров со статусом и портами, тома и сети. Команда ds для ручного вызова.

Требования

  • Docker установлен и запущен
  • Bash

Установка

cat > /etc/profile.d/docker-motd.sh << 'SCRIPT' #!/bin/bash # Docker status MOTD [[ $- != *i* ]] && return command -v docker &>/dev/null || return C_RESET='\\033[0m'; C_BOLD='\\033[1m'; C_DIM='\\033[2m' C_GREEN='\\033[32m'; C_RED='\\033[31m'; C_YELLOW='\\033[33m' C_CYAN='\\033[36m'; C_BLUE='\\033[34m'; C_MAGENTA='\\033[35m' C_WHITE='\\033[97m'; C_LINE='\\033[38;5;240m' _hr() { printf "${C_LINE} %-60s${C_RESET} " "------------------------------------------------------------"; } _docker_motd() { local hostname uptime_str mem_total mem_used mem_pct disk_used disk_total disk_pct os_name hostname=$(hostname -f 2>/dev/null || hostname) uptime_str=$(uptime -p 2>/dev/null | sed 's/up //') read -r mem_total mem_used <<< "$(free -m | awk '/^Mem:/ {print $2, $3}')" mem_pct=$(( mem_used * 100 / mem_total )) read -r disk_used disk_total disk_pct <<< "$(df -h / | awk 'NR==2 {print $3, $2, $5}')" os_name=$(. /etc/os-release 2>/dev/null && echo "$PRETTY_NAME" || echo "Linux") echo "" printf " ${C_BOLD}${C_CYAN}>> %s${C_RESET} ${C_DIM}| %s | up %s${C_RESET} " "$hostname" "$os_name" "$uptime_str" printf " ${C_DIM} RAM: ${C_WHITE}%s${C_DIM}/%sM (%s%%) | Disk: ${C_WHITE}%s${C_DIM}/%s (%s)${C_RESET} " \\ "$mem_used" "$mem_total" "$mem_pct" "$disk_used" "$disk_total" "$disk_pct" _hr printf " ${C_BOLD}${C_BLUE}>> CONTAINERS${C_RESET} " printf " ${C_DIM} %-18s %-20s %-14s %s${C_RESET} " "NAME" "IMAGE" "STATUS" "PORTS" _hr docker ps -a --format '{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}' 2>/dev/null | \\ while IFS='|' read -r name image status ports; do local color="$C_GREEN" icon="*" [[ "$status" == *"Exited"* ]] && color="$C_RED" && icon="o" [[ "$status" == *"Restarting"* ]] && color="$C_YELLOW" && icon="~" status=$(echo "$status" | sed -E 's/ \\([^)]+\\)//g; s/Up /up /; s/Exited /exit /') [ ${#image} -gt 18 ] && image="${image:0:15}..." ports=$(echo "$ports" | sed -E 's/0\\.0\\.0\\.0://g; s/\\[::\\]://g; s|/tcp||g; s/, /,/g') [ -z "$ports" ] && ports="-" printf " ${color}${icon}${C_RESET} ${C_WHITE}%-18s${C_RESET} ${C_DIM}%-20s${C_RESET} ${color}%-14s${C_RESET} ${C_MAGENTA}%s${C_RESET} " \\ "$name" "$image" "$status" "$ports" done echo "" printf " ${C_BOLD}${C_BLUE}>> VOLUMES${C_RESET} " docker volume ls --format '{{.Name}}' 2>/dev/null | while read -r vname; do local size size=$(docker system df -v 2>/dev/null | awk -v n="$vname" '$1==n {print $3}') [ -z "$size" ] && size="-" printf " ${C_CYAN}*${C_RESET} ${C_WHITE}%-35s${C_RESET} ${C_DIM}%s${C_RESET} " "$vname" "$size" done echo "" printf " ${C_BOLD}${C_BLUE}>> NETWORKS${C_RESET} " docker network ls --format '{{.Name}}|{{.Driver}}' 2>/dev/null | \\ while IFS='|' read -r nname driver; do [[ "$nname" == "bridge" || "$nname" == "host" || "$nname" == "none" ]] && continue local containers containers=$(docker network inspect "$nname" --format '{{range .Containers}}{{.Name}} {{end}}' 2>/dev/null | xargs) [ -z "$containers" ] && containers="-" printf " ${C_YELLOW}*${C_RESET} ${C_WHITE}%-25s${C_RESET} ${C_DIM}%-8s${C_RESET} -> ${C_GREEN}%s${C_RESET} " \\ "$nname" "$driver" "$containers" done echo "" _hr local total running stopped total=$(docker ps -aq 2>/dev/null | wc -l) running=$(docker ps -q 2>/dev/null | wc -l) stopped=$((total - running)) printf " ${C_DIM}Total: ${C_WHITE}%d${C_DIM} | * %d running" "$total" "$running" [ "$stopped" -gt 0 ] && printf " | o %d stopped" "$stopped" printf "${C_RESET} " } ds() { _docker_motd; } [ -n "$SSH_CONNECTION" ] || [ -n "$SSH_TTY" ] && _docker_motd SCRIPT chmod +x /etc/profile.d/docker-motd.sh

Ручное обновление

ds

Удаление

rm -f /etc/profile.d/docker-motd.sh

Примечания

  • Скрипт выполняется только в интерактивной SSH-сессии
  • Если MOTD не отображается — проверь PrintMotd в /etc/ssh/sshd_config
  • Команда ds доступна после перезахода в SSH или source /etc/profile.d/docker-motd.sh