package docker import ( "context" "fmt" "log/slog" "goseg/structs" "encoding/json" "os" "github.com/docker/docker/api/types" "github.com/docker/docker/client" ) var ( logger = slog.New(slog.NewJSONHandler(os.Stdout, nil)) ) func GetShipStatus(patps []string) (map[string]string, error) { statuses := make(map[string]string) cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { errmsg := fmt.Sprintf("Error getting Docker info: %v", err) logger.Error(errmsg) return statuses, err } else { containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{}) if err != nil { errmsg := fmt.Sprintf("Error getting containers: %v", err) logger.Error(errmsg) return statuses, err } else { for _, pier := range patps { found := false for _, container := range containers { for _, name := range container.Names { fasPier := "/" + pier if name == fasPier { statuses[pier] = container.Status found = true break } } if found { break } } if !found { statuses[pier] = "not found" } } } return statuses, nil } } func GetContainerNetwork(name string) (string, error) { cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { return "", err } defer cli.Close() containerJSON, err := cli.ContainerInspect(context.Background(), name) if err != nil { return "", err } for networkName := range containerJSON.NetworkSettings.Networks { return networkName, nil } return "", fmt.Errorf("container is not attached to any network") } func GetContainerStats(containerName string) (*structs.ContainerStats, error) { cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { return nil, err } defer cli.Close() statsResp, err := cli.ContainerStats(context.Background(), containerName, false) if err != nil { return nil, err } defer statsResp.Body.Close() var stat types.StatsJSON if err := json.NewDecoder(statsResp.Body).Decode(&stat); err != nil { return nil, err } memUsage := stat.MemoryStats.Usage inspectResp, err := cli.ContainerInspect(context.Background(), containerName) if err != nil { return nil, err } diskUsage := inspectResp.SizeRw return &structs.ContainerStats{ MemoryUsage: memUsage, DiskUsage: diskUsage, }, nil }