func main() { flag.Parse() if flag.NArg() < 1 { log.Fatal(usage) } if *podName == "" { if flag.NArg() > 1 { log.Fatal(usage) } _, *podName = parseDockerImage(flag.Arg(0)) } if (!*generateJSON && !*generateYAML) || (*generateJSON && *generateYAML) { log.Fatal(usage) } dockerHost := os.Getenv("DOCKER_HOST") if dockerHost == "" { log.Fatalf("DOCKER_HOST is not set") } docker, err := dockerclient.NewClient(dockerHost) if err != nil { log.Fatalf("failed to connect to %q: %v", dockerHost, err) } podContainers := []v1beta1.Container{} for _, imageName := range flag.Args() { parts, baseName := parseDockerImage(imageName) container := v1beta1.Container{ Name: baseName, Image: imageName, } // TODO(proppy): use the regitry API instead of the remote API to get image metadata. img, err := docker.InspectImage(imageName) if err != nil { log.Fatalf("failed to inspect image %q: %v", imageName, err) } for p := range img.Config.ExposedPorts { port, err := strconv.Atoi(p.Port()) if err != nil { log.Fatalf("failed to parse port %q: %v", parts[0], err) } container.Ports = append(container.Ports, v1beta1.Port{ Name: strings.Join([]string{baseName, p.Proto(), p.Port()}, "-"), ContainerPort: port, Protocol: v1beta1.Protocol(strings.ToUpper(p.Proto())), }) } podContainers = append(podContainers, container) } // TODO(proppy): add flag to handle multiple version manifest := v1beta1.ContainerManifest{ Version: "v1beta1", ID: *podName + "-pod", Containers: podContainers, RestartPolicy: v1beta1.RestartPolicy{ Always: &v1beta1.RestartPolicyAlways{}, }, } if *generateJSON { bs, err := json.MarshalIndent(manifest, "", " ") if err != nil { log.Fatalf("failed to render JSON container manifest: %v", err) } os.Stdout.Write(bs) } if *generateYAML { bs, err := yaml.Marshal(manifest) if err != nil { log.Fatalf("failed to render YAML container manifest: %v", err) } os.Stdout.Write(bs) } }
func main() { flag.Parse() if flag.NArg() < 1 { log.Fatal(usage) } if *podName == "" { if flag.NArg() > 1 { log.Print(usage) log.Fatal("podex: -id arg is required when passing more than one image") } _, _, *podName, _ = splitDockerImageName(flag.Arg(0)) } if (!*generateJSON && !*generateYAML) || (*generateJSON && *generateYAML) { log.Fatal(usage) } podContainers := []v1beta1.Container{} for _, imageName := range flag.Args() { host, namespace, repo, tag := splitDockerImageName(imageName) container := v1beta1.Container{ Name: repo, Image: imageName, } img, err := getImageMetadata(host, namespace, repo, tag) if err != nil { log.Fatalf("failed to get image metadata %q: %v", imageName, err) } for p := range img.ContainerConfig.ExposedPorts { port, err := strconv.Atoi(p.Port()) if err != nil { log.Fatalf("failed to parse port %q: %v", p.Port(), err) } container.Ports = append(container.Ports, v1beta1.Port{ Name: strings.Join([]string{repo, p.Proto(), p.Port()}, "-"), ContainerPort: port, Protocol: v1beta1.Protocol(strings.ToUpper(p.Proto())), }) } podContainers = append(podContainers, container) } // TODO(proppy): add flag to handle multiple version manifest := v1beta1.ContainerManifest{ Version: "v1beta1", ID: *podName + "-pod", Containers: podContainers, RestartPolicy: v1beta1.RestartPolicy{ Always: &v1beta1.RestartPolicyAlways{}, }, } if *generateJSON { bs, err := json.MarshalIndent(manifest, "", " ") if err != nil { log.Fatalf("failed to render JSON container manifest: %v", err) } os.Stdout.Write(bs) } if *generateYAML { bs, err := yaml.Marshal(manifest) if err != nil { log.Fatalf("failed to render YAML container manifest: %v", err) } os.Stdout.Write(bs) } }