209 lines
5.6 KiB
Bash
209 lines
5.6 KiB
Bash
#!/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
|