79 lines
2.1 KiB
Go
79 lines
2.1 KiB
Go
package main
|
||
|
||
import (
|
||
"context"
|
||
"os/exec"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
// readDockerStats 读取 Docker 统计信息(简化版)
|
||
func readDockerStats() DockerStats {
|
||
stats := DockerStats{
|
||
Available: false,
|
||
RunningNames: []string{},
|
||
StoppedNames: []string{},
|
||
ImageNames: []string{},
|
||
}
|
||
|
||
// 检查 docker 是否可用
|
||
if _, err := exec.LookPath("docker"); err != nil {
|
||
return stats
|
||
}
|
||
|
||
stats.Available = true
|
||
|
||
// 获取 Docker 版本
|
||
cmd := exec.Command("docker", "--version")
|
||
if out, err := cmd.Output(); err == nil {
|
||
stats.Version = strings.TrimSpace(string(out))
|
||
}
|
||
|
||
// 获取运行中的容器名
|
||
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||
defer cancel()
|
||
cmd = exec.CommandContext(ctx, "docker", "ps", "--format", "{{.Names}}")
|
||
if out, err := cmd.Output(); err == nil {
|
||
lines := strings.Split(strings.TrimSpace(string(out)), "\n")
|
||
for _, line := range lines {
|
||
line = strings.TrimSpace(line)
|
||
if line != "" {
|
||
stats.RunningNames = append(stats.RunningNames, line)
|
||
stats.Running++
|
||
}
|
||
}
|
||
}
|
||
|
||
// 获取停止的容器名
|
||
ctx, cancel = context.WithTimeout(context.Background(), 3*time.Second)
|
||
defer cancel()
|
||
cmd = exec.CommandContext(ctx, "docker", "ps", "-a", "--filter", "status=exited", "--format", "{{.Names}}")
|
||
if out, err := cmd.Output(); err == nil {
|
||
lines := strings.Split(strings.TrimSpace(string(out)), "\n")
|
||
for _, line := range lines {
|
||
line = strings.TrimSpace(line)
|
||
if line != "" {
|
||
stats.StoppedNames = append(stats.StoppedNames, line)
|
||
stats.Stopped++
|
||
}
|
||
}
|
||
}
|
||
|
||
// 获取镜像名(只获取前20个,避免数据过多)
|
||
ctx, cancel = context.WithTimeout(context.Background(), 3*time.Second)
|
||
defer cancel()
|
||
cmd = exec.CommandContext(ctx, "docker", "images", "--format", "{{.Repository}}:{{.Tag}}")
|
||
if out, err := cmd.Output(); err == nil {
|
||
lines := strings.Split(strings.TrimSpace(string(out)), "\n")
|
||
for _, line := range lines {
|
||
line = strings.TrimSpace(line)
|
||
if line != "" && line != "<none>:<none>" {
|
||
stats.ImageNames = append(stats.ImageNames, line)
|
||
stats.ImageCount++
|
||
}
|
||
}
|
||
}
|
||
|
||
return stats
|
||
}
|