diff --git a/dist/go-compose-exporter_darwin_amd64 b/dist/go-compose-exporter_darwin_amd64 index fc174e3..94eb3df 100755 Binary files a/dist/go-compose-exporter_darwin_amd64 and b/dist/go-compose-exporter_darwin_amd64 differ diff --git a/dist/go-compose-exporter_darwin_arm64 b/dist/go-compose-exporter_darwin_arm64 index 4b02c2c..fead102 100755 Binary files a/dist/go-compose-exporter_darwin_arm64 and b/dist/go-compose-exporter_darwin_arm64 differ diff --git a/dist/go-compose-exporter_linux_amd64 b/dist/go-compose-exporter_linux_amd64 index 1108bf3..8bfc627 100755 Binary files a/dist/go-compose-exporter_linux_amd64 and b/dist/go-compose-exporter_linux_amd64 differ diff --git a/dist/go-compose-exporter_linux_amd64_static b/dist/go-compose-exporter_linux_amd64_static index 4bd77b0..2e9a199 100755 Binary files a/dist/go-compose-exporter_linux_amd64_static and b/dist/go-compose-exporter_linux_amd64_static differ diff --git a/dist/go-compose-exporter_linux_arm64 b/dist/go-compose-exporter_linux_arm64 index e92f7d7..22ec793 100755 Binary files a/dist/go-compose-exporter_linux_arm64 and b/dist/go-compose-exporter_linux_arm64 differ diff --git a/dist/go-compose-exporter_linux_arm64_static b/dist/go-compose-exporter_linux_arm64_static index 7d67cdb..49f0c18 100755 Binary files a/dist/go-compose-exporter_linux_arm64_static and b/dist/go-compose-exporter_linux_arm64_static differ diff --git a/dist/go-compose-exporter_windows_amd64 b/dist/go-compose-exporter_windows_amd64 index 1c6cc52..be04028 100755 Binary files a/dist/go-compose-exporter_windows_amd64 and b/dist/go-compose-exporter_windows_amd64 differ diff --git a/main.go b/main.go index 25354d3..d4611e4 100644 --- a/main.go +++ b/main.go @@ -143,7 +143,7 @@ func listContainers() ([]Container, error) { } func inspectContainer(containerID string) ([]string, []string, []string, []string, string, error) { - cmd := exec.Command("docker", "inspect", "--format", `{{range .Config.Env}}{{println .}}{{end}}{{range .NetworkSettings.Networks}}{{println .}}{{end}}{{range .Mounts}}{{println .}}{{end}}{{range $p, $conf := .HostConfig.PortBindings}}{{println $p}}{{end}}{{.HostConfig.RestartPolicy.Name}}`, containerID) + cmd := exec.Command("docker", "inspect", "--format", `{{json .Config.Env}} {{json .NetworkSettings.Networks}} {{json .Mounts}} {{json .HostConfig.PortBindings}} {{.HostConfig.RestartPolicy.Name}}`, containerID) var out bytes.Buffer cmd.Stdout = &out err := cmd.Run() @@ -151,29 +151,74 @@ func inspectContainer(containerID string) ([]string, []string, []string, []strin return nil, nil, nil, nil, "", err } - lines := strings.Split(out.String(), "\n") - - var envVars, networks, volumes, ports []string + output := out.String() + parts := strings.Split(output, " ") + envVars, networks, volumes, ports := []string{}, []string{}, []string{}, []string{} restartPolicy := "" - for _, line := range lines { - if strings.Contains(line, "=") { - envVars = append(envVars, line) - } else if strings.Contains(line, "Name:") && strings.Contains(line, "Driver:") { - networks = append(networks, strings.TrimSpace(line)) - } else if strings.Contains(line, "Source:") && strings.Contains(line, "Destination:") { - volume := strings.Split(line, "Destination:")[1] - volumes = append(volumes, volume) - } else if strings.Contains(line, "/tcp") || strings.Contains(line, "/udp") { - ports = append(ports, line) - } else if line != "" { - restartPolicy = line - } + if len(parts) > 0 && parts[0] != "null" { + envVars = parseJSONStringArray(parts[0]) + } + if len(parts) > 1 && parts[1] != "null" { + networks = parseJSONNetworkNames(parts[1]) + } + if len(parts) > 2 && parts[2] != "null" { + volumes = parseJSONVolumeMounts(parts[2]) + } + if len(parts) > 3 && parts[3] != "null" { + ports = parseJSONPorts(parts[3]) + } + if len(parts) > 4 { + restartPolicy = strings.Trim(parts[4], `"`) } return envVars, networks, volumes, ports, restartPolicy, nil } +func parseJSONStringArray(jsonStr string) []string { + jsonStr = strings.Trim(jsonStr, "[]") + if jsonStr == "" { + return []string{} + } + return strings.Split(jsonStr, ",") +} + +func parseJSONNetworkNames(jsonStr string) []string { + var networkNames []string + networkData := strings.Split(jsonStr, ":") + for _, data := range networkData { + if strings.Contains(data, "\"Name\"") { + parts := strings.Split(data, "\"") + networkNames = append(networkNames, parts[1]) + } + } + return networkNames +} + +func parseJSONVolumeMounts(jsonStr string) []string { + var volumeMounts []string + volumeData := strings.Split(jsonStr, "},{") + for _, data := range volumeData { + if strings.Contains(data, "\"Destination\"") { + parts := strings.Split(data, "\"") + volumeMounts = append(volumeMounts, parts[3]) + } + } + return volumeMounts +} + +func parseJSONPorts(jsonStr string) []string { + var ports []string + portData := strings.Split(jsonStr, "},{") + for _, data := range portData { + if strings.Contains(data, "\"HostPort\"") { + parts := strings.Split(data, "\"") + ports = append(ports, parts[3]+":"+parts[7]) + } + } + return ports +} + func isDockerSwarmStack(stackName string, containers []Container) bool { for _, container := range containers { if strings.Contains(container.Name, ".") {