opts.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package run
  2. import (
  3. "strconv"
  4. "github.com/docker/go-connections/nat"
  5. "github.com/docker/api/containers"
  6. )
  7. // Opts contain run command options
  8. type Opts struct {
  9. Name string
  10. Publish []string
  11. }
  12. // ToContainerConfig convert run options to a container configuration
  13. func (r *Opts) ToContainerConfig(image string) (containers.ContainerConfig, error) {
  14. publish, err := r.toPorts()
  15. if err != nil {
  16. return containers.ContainerConfig{}, err
  17. }
  18. return containers.ContainerConfig{
  19. ID: r.Name,
  20. Image: image,
  21. Ports: publish,
  22. }, nil
  23. }
  24. func (r *Opts) toPorts() ([]containers.Port, error) {
  25. _, bindings, err := nat.ParsePortSpecs(r.Publish)
  26. if err != nil {
  27. return nil, err
  28. }
  29. var result []containers.Port
  30. for port, bind := range bindings {
  31. for _, portbind := range bind {
  32. var hostPort uint32
  33. if portbind.HostPort != "" {
  34. hp, err := strconv.Atoi(portbind.HostPort)
  35. if err != nil {
  36. return nil, err
  37. }
  38. hostPort = uint32(hp)
  39. } else {
  40. hostPort = uint32(port.Int())
  41. }
  42. result = append(result, containers.Port{
  43. HostPort: hostPort,
  44. ContainerPort: uint32(port.Int()),
  45. Protocol: port.Proto(),
  46. HostIP: portbind.HostIP,
  47. })
  48. }
  49. }
  50. return result, nil
  51. }