Files
PropertyDeployment/sh/show-docker.sh
2025-12-09 20:22:03 +08:00

209 lines
5.6 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ===========================================================
# Docker 容器选项式管理脚本
# 作者anfioo
# 功能:交互式查看、管理、操作 Docker 容器
# ===========================================================
# 获取所有容器信息
get_containers() {
docker ps -a --format "{{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}"
}
# 容器选择菜单
select_container() {
echo "请选择一个容器(输入序号):"
mapfile -t containers < <(get_containers)
for i in "${!containers[@]}"; do
echo "$((i+1)). ${containers[$i]}"
done
echo "0. 退出"
read -p "选择容器编号:" choice
if [[ $choice -eq 0 ]]; then
exit 0
fi
container_id=$(echo "${containers[$((choice-1))]}" | awk '{print $1}')
container_name=$(echo "${containers[$((choice-1))]}" | awk '{print $5}')
echo
echo "🎯 你选择了容器:$container_name ($container_id)"
echo
container_menu "$container_id" "$container_name"
}
# 容器信息展示菜单
container_menu() {
local id="$1"
local name="$2"
while true; do
echo "=============================="
echo "容器:$name ($id)"
echo "=============================="
echo "1. 查看元数据docker ps 样式)"
echo "2. 查看详细信息Labels、Volumes、Network、Restart"
echo "3. 容器控制操作(进入、停止、启动、重启、日志)"
echo "4. 全部详细信息inspect 解析展示)"
echo "0. 返回容器列表"
echo "=============================="
read -p "选择功能:" action
case $action in
1)
docker ps -a --filter "id=$id"
;;
2)
echo "🔹 Labels:"
docker inspect "$id" | jq '.[0].Config.Labels'
echo
echo "🔹 Volumes:"
docker inspect "$id" | jq '.[0].Mounts[] | {Name, Source, Destination}'
echo
echo "🔹 Network:"
docker inspect "$id" | jq -r '.[0].HostConfig.NetworkMode'
echo
echo "🔹 Restart Policy:"
docker inspect "$id" | jq -r '.[0].HostConfig.RestartPolicy.Name'
;;
3)
container_control_menu "$id" "$name"
;;
4)
container_details "$id"
;;
0)
clear
select_container
;;
*)
echo "无效输入,请重新选择。"
;;
esac
done
}
# 容器控制操作菜单
container_control_menu() {
local id="$1"
local name="$2"
while true; do
echo
echo "=== 🛠️ 容器控制菜单:$name ==="
echo "1. 进入容器 (bash)"
echo "2. 停止容器"
echo "3. 启动容器"
echo "4. 重启容器"
echo "5. 查看日志"
echo "0. 返回上级菜单"
echo "==========================="
read -p "选择功能:" op
case $op in
1)
echo "进入容器:$name"
docker exec -it "$id" bash || docker exec -it "$id" sh
;;
2)
docker stop "$id"
;;
3)
docker start "$id"
;;
4)
docker restart "$id"
;;
5)
log_menu "$id"
;;
0)
return
;;
*)
echo "无效输入,请重新选择。"
;;
esac
done
}
# 日志查看菜单
log_menu() {
local id="$1"
while true; do
echo
echo "=== 📜 日志查看菜单 ==="
echo "1. 全部日志(退出)"
echo "2. 实时跟踪 (-f)"
echo "3. 最近 100 条并跟踪"
echo "4. 最近 100 条并退出"
echo "0. 返回上级菜单"
echo "======================"
read -p "选择功能:" log_choice
case $log_choice in
1)
docker logs "$id"
;;
2)
docker logs -f "$id"
;;
3)
docker logs -n 100 -f "$id"
;;
4)
docker logs -n 100 "$id"
;;
0)
return
;;
*)
echo "无效输入,请重新选择。"
;;
esac
done
}
# 功能展示3完整信息
container_details() {
local id="$1"
echo
echo "=== 🧾 容器详细信息 ==="
echo "运行命令:"
docker inspect "$id" | jq -r '.[0].Config.Cmd'
echo
echo "运行环境变量:"
docker inspect "$id" | jq -r '.[0].Config.Env[]'
echo
echo "端口信息:"
docker inspect "$id" | jq -r '.[0].NetworkSettings.Ports'
echo
echo "状态信息:"
docker inspect "$id" | jq -r '.[0].State'
echo
echo "内存/CPU 限制:"
docker inspect "$id" | jq '.[0].HostConfig | {Memory, NanoCpus}'
echo
echo "运行时间:"
docker inspect "$id" | jq -r '.[0].State.StartedAt'
echo
echo "运行路径:"
docker inspect "$id" | jq -r '.[0].GraphDriver.Data.MergedDir'
echo
echo "运行用户:"
docker inspect "$id" | jq -r '.[0].Config.User'
echo
echo "版本信息:"
docker inspect "$id" | jq -r '.[0].Config.Image'
echo
echo "挂载卷:"
docker inspect "$id" | jq -r '.[0].Mounts[] | {Name, Source, Destination}'
echo
echo "网络组:"
docker inspect "$id" | jq -r '.[0].HostConfig.NetworkMode'
echo
echo "重启策略:"
docker inspect "$id" | jq -r '.[0].HostConfig.RestartPolicy.Name'
echo
echo "=============================="
}
# 主流程
clear
select_container