opts.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package run
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "github.com/docker/docker/pkg/namesgenerator"
  7. "github.com/docker/go-connections/nat"
  8. "github.com/docker/api/containers"
  9. )
  10. // Opts contain run command options
  11. type Opts struct {
  12. Name string
  13. Publish []string
  14. Labels []string
  15. Volumes []string
  16. }
  17. // ToContainerConfig convert run options to a container configuration
  18. func (r *Opts) ToContainerConfig(image string) (containers.ContainerConfig, error) {
  19. if r.Name == "" {
  20. r.Name = getRandomName()
  21. }
  22. publish, err := r.toPorts()
  23. if err != nil {
  24. return containers.ContainerConfig{}, err
  25. }
  26. labels, err := toLabels(r.Labels)
  27. if err != nil {
  28. return containers.ContainerConfig{}, err
  29. }
  30. return containers.ContainerConfig{
  31. ID: r.Name,
  32. Image: image,
  33. Ports: publish,
  34. Labels: labels,
  35. Volumes: r.Volumes,
  36. }, nil
  37. }
  38. func (r *Opts) toPorts() ([]containers.Port, error) {
  39. _, bindings, err := nat.ParsePortSpecs(r.Publish)
  40. if err != nil {
  41. return nil, err
  42. }
  43. var result []containers.Port
  44. for port, bind := range bindings {
  45. for _, portbind := range bind {
  46. var hostPort uint32
  47. if portbind.HostPort != "" {
  48. hp, err := strconv.Atoi(portbind.HostPort)
  49. if err != nil {
  50. return nil, err
  51. }
  52. hostPort = uint32(hp)
  53. } else {
  54. hostPort = uint32(port.Int())
  55. }
  56. result = append(result, containers.Port{
  57. HostPort: hostPort,
  58. ContainerPort: uint32(port.Int()),
  59. Protocol: port.Proto(),
  60. HostIP: portbind.HostIP,
  61. })
  62. }
  63. }
  64. return result, nil
  65. }
  66. func toLabels(labels []string) (map[string]string, error) {
  67. result := map[string]string{}
  68. for _, label := range labels {
  69. parts := strings.Split(label, "=")
  70. if len(parts) != 2 {
  71. return nil, fmt.Errorf("wrong label format %q", label)
  72. }
  73. result[parts[0]] = parts[1]
  74. }
  75. return result, nil
  76. }
  77. func getRandomName() string {
  78. // Azure supports hyphen but not underscore in names
  79. return strings.Replace(namesgenerator.GetRandomName(0), "_", "-", -1)
  80. }