Linux Docker статус в MOTD
Скрипт выводит сводку по 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