Files
Linux_post_install/bin/pos-docker-ps
T
2026-07-28 10:28:11 -04:00

128 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
source "$(dirname "$0")/../lib/common.sh" 2>/dev/null || source "$(dirname "$0")/common.sh"
usage() {
cat <<EOF
Usage: pos docker ps
Display enhanced Docker container overview with health status,
uptime, IPs, and port mappings.
EOF
exit 0
}
case "${1:-}" in
-h|--help) usage ;;
esac
if ! command -v docker &>/dev/null; then
echo "docker not found"
exit 1
fi
if ! container_ids=$(docker ps -q 2>/dev/null) || [[ -z "$container_ids" ]]; then
echo "No running containers."
exit 0
fi
healthy_count=0
unhealthy_count=0
running_count=0
total_count=0
printf "%-28s %-35s %-22s %-10s %-35s %-20s %s\n" \
"NAME" "IMAGE" "STATUS(HEALTH)" "UPTIME" "IPS" "PORTS" "CONTAINER ID"
for cid in $container_ids; do
total_count=$((total_count + 1))
info=$(docker inspect "$cid" 2>/dev/null) || continue
name=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['Name'].lstrip('/'))" 2>/dev/null)
image=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['Config']['Image'])" 2>/dev/null)
status=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['State']['Status'])" 2>/dev/null)
health=$(echo "$info" | python3 -c "
import sys,json
d=json.load(sys.stdin)[0]
h=d.get('State',{}).get('Health',{})
print(h.get('Status','') if h else '')
" 2>/dev/null || true)
started_at=$(echo "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['State']['StartedAt'])" 2>/dev/null)
ip_data=$(echo "$info" | python3 -c "
import sys,json
d=json.load(sys.stdin)[0]
nets=d.get('NetworkSettings',{}).get('Networks',{})
out=' '.join(f'{k}:{v.get(\"IPAddress\",\"\")}' for k,v in nets.items() if v.get('IPAddress'))
print(out or '-')
" 2>/dev/null)
port_data=$(echo "$info" | python3 -c "
import sys,json
d=json.load(sys.stdin)[0]
ports=d.get('NetworkSettings',{}).get('Ports',{}) or {}
parts=[]
for container_port, bindings in ports.items():
if bindings:
for b in bindings:
hp=b.get('HostPort','')
hi=b.get('HostIp','')
if hi and hp:
parts.append(f'{hi}:{hp}->{container_port}')
elif hp:
parts.append(f'{hp}->{container_port}')
else:
parts.append(container_port)
else:
parts.append(container_port)
print(', '.join(parts) if parts else '-')
" 2>/dev/null)
[ "${#image}" -gt 35 ] && image="${image:0:32}..."
if [ "$status" = "running" ]; then
running_count=$((running_count + 1))
fi
if [ -n "$health" ]; then
case "$health" in
healthy) healthy_count=$((healthy_count + 1)); status_display="${GREEN}${status} (${health})${RESET}" ;;
unhealthy) unhealthy_count=$((unhealthy_count + 1)); status_display="${RED}${status} (${health})${RESET}" ;;
*) status_display="${YELLOW}${status} (${health})${RESET}" ;;
esac
else
status_display="${YELLOW}${status}${RESET}"
fi
uptime="-"
if start_ts=$(date -d "$started_at" +%s 2>/dev/null); then
now_ts=$(date +%s)
diff=$((now_ts - start_ts))
days=$((diff / 86400))
hours=$(((diff % 86400) / 3600))
mins=$(((diff % 3600) / 60))
if [ "$days" -gt 0 ]; then
uptime="${days}d ${hours}h"
elif [ "$hours" -gt 0 ]; then
uptime="${hours}h ${mins}m"
else
uptime="${mins}m"
fi
fi
printf "%-28s %-35s %-22b %-10s %-35s %-20s %s\n" \
"$name" "$image" "$status_display" "$uptime" "$ip_data" "$port_data" "$cid"
done
echo
printf '%*s\n' 120 '' | tr ' ' '-'
echo "Containers : $total_count"
echo "Healthy : $healthy_count"
echo "Unhealthy : $unhealthy_count"
echo "Running : $running_count"
if [ "$unhealthy_count" -gt 0 ]; then
echo
echo "${RED}Warning: unhealthy containers detected${RESET}"
fi