github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/docker/service.go (about)

     1  package docker
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/go-courier/ptr"
     8  )
     9  
    10  func NewService(image string) *Service {
    11  	return Service{}.WithImage(image)
    12  }
    13  
    14  type Service struct {
    15  	Image          Image             `yaml:"image"`
    16  	EntryPoint     MaybeListString   `yaml:"entrypoint,omitempty"`
    17  	Command        MaybeListString   `yaml:"command,omitempty"`
    18  	Labels         map[string]string `yaml:"labels,omitempty"`
    19  	Environment    map[string]string `yaml:"environment,omitempty"`
    20  	Ports          []Port            `yaml:"ports,omitempty"`
    21  	Links          []Link            `yaml:"links,omitempty"`
    22  	ExternalLinks  []Link            `yaml:"external_links,omitempty"`
    23  	Volumes        []Volume          `yaml:"volumes,omitempty"`
    24  	VolumesFrom    []Volume          `yaml:"volumes_from,omitempty"`
    25  	WorkingDir     string            `yaml:"working_dir,omitempty"`
    26  	DnsSearch      []string          `yaml:"dns_search,omitempty"`
    27  	Dns            []string          `yaml:"dns,omitempty"`
    28  	TTY            *bool             `yaml:"tty,omitempty"`
    29  	MemLimit       *int64            `yaml:"mem_limit,omitempty"`
    30  	MemSwapLimit   *int64            `yaml:"memswap_limit,omitempty"`
    31  	MemReservation *int64            `yaml:"mem_reservation,omitempty"`
    32  }
    33  
    34  func (service Service) Merge(nextService *Service) *Service {
    35  	if !nextService.Image.IsZero() {
    36  		service.Image = nextService.Image
    37  	}
    38  
    39  	if !nextService.Command.IsZero() {
    40  		service.Command = nextService.Command
    41  	}
    42  
    43  	if service.Labels == nil {
    44  		service.Labels = nextService.Labels
    45  	} else {
    46  		for key, value := range nextService.Labels {
    47  			service.Labels[key] = value
    48  		}
    49  	}
    50  
    51  	if service.Environment == nil {
    52  		service.Environment = nextService.Environment
    53  	} else {
    54  		for key, value := range nextService.Environment {
    55  			service.Environment[key] = value
    56  		}
    57  	}
    58  
    59  	service.Ports = append(service.Ports, nextService.Ports...)
    60  	service.Volumes = append(service.Volumes, nextService.Volumes...)
    61  	service.VolumesFrom = append(service.VolumesFrom, nextService.VolumesFrom...)
    62  
    63  	if nextService.WorkingDir != "" {
    64  		service.WorkingDir = nextService.WorkingDir
    65  	}
    66  
    67  	if len(nextService.Dns) > 0 {
    68  		service.Dns = nextService.Dns
    69  	}
    70  
    71  	if len(nextService.DnsSearch) > 0 {
    72  		service.DnsSearch = nextService.DnsSearch
    73  	}
    74  
    75  	if nextService.TTY != nil {
    76  		service.TTY = nextService.TTY
    77  	}
    78  
    79  	if nextService.MemLimit != nil {
    80  		service.MemLimit = nextService.MemLimit
    81  	}
    82  
    83  	if nextService.MemLimit != nil {
    84  		service.MemLimit = nextService.MemLimit
    85  	}
    86  
    87  	return &service
    88  }
    89  
    90  func (service Service) addPort(port int16, containerPort int16, protocol Protocol) *Service {
    91  	service.Ports = append(service.Ports, Port{
    92  		Port:          port,
    93  		ContainerPort: containerPort,
    94  		Protocol:      protocol,
    95  	})
    96  	return &service
    97  }
    98  
    99  func (service Service) addVolume(nameOrLocalPath string, mountPath string, accessMode VolumeAccessMode) *Service {
   100  	v, err := ParseVolumeString(strings.Join([]string{
   101  		nameOrLocalPath,
   102  		mountPath,
   103  		string(accessMode),
   104  	}, ":"))
   105  	if err != nil {
   106  		panic(err)
   107  	}
   108  
   109  	service.Volumes = append(service.Volumes, *v)
   110  	return &service
   111  }
   112  
   113  func (service Service) WithImage(image string) *Service {
   114  	i, err := ParseImageString(image)
   115  	if err != nil {
   116  		panic(fmt.Sprintf("invalid image %s", image))
   117  	}
   118  	service.Image = *i
   119  	return &service
   120  }
   121  
   122  func (service Service) EnableTTY() *Service {
   123  	service.TTY = ptr.Bool(true)
   124  	return &service
   125  }
   126  
   127  func (service Service) AddLink(s string, host string) *Service {
   128  	service.Links = append(service.Links, Link{
   129  		Service: s,
   130  		Host:    host,
   131  	})
   132  	return &service
   133  }
   134  
   135  func (service Service) AddDns(dns string, dnsSearch string) *Service {
   136  	service.DnsSearch = []string{dnsSearch}
   137  	service.Dns = []string{dns}
   138  	return &service
   139  }
   140  
   141  func (service Service) AddExternalLink(s string, host string) *Service {
   142  	service.ExternalLinks = append(service.ExternalLinks, Link{
   143  		Service: s,
   144  		Host:    host,
   145  	})
   146  	return &service
   147  }
   148  
   149  func (service Service) AddTCPPort(port int16, containerPort int16) *Service {
   150  	service.addPort(port, containerPort, ProtocolTCP)
   151  	return &service
   152  }
   153  
   154  func (service Service) AddUDPPort(port int16, containerPort int16) *Service {
   155  	service.addPort(port, containerPort, ProtocolUDP)
   156  	return &service
   157  }
   158  
   159  func (service Service) SetCommand(commands ...string) *Service {
   160  	service.Command = MaybeListStringFromStringList(commands...)
   161  	return &service
   162  }
   163  
   164  func (service Service) AddVolumeFrom(name string, accessMode VolumeAccessMode) *Service {
   165  	service.VolumesFrom = append(service.VolumesFrom, Volume{
   166  		Name:       name,
   167  		AccessMode: accessMode,
   168  	})
   169  	return &service
   170  }
   171  
   172  func (service Service) AddRWVolume(nameOrLocalPath string, mountPath string) *Service {
   173  	service.addVolume(nameOrLocalPath, mountPath, VolumeAccessModeReadWrite)
   174  	return &service
   175  }
   176  
   177  func (service Service) AddROVolume(nameOrLocalPath string, mountPath string) *Service {
   178  	service.addVolume(nameOrLocalPath, mountPath, VolumeAccessModeReadOnly)
   179  	return &service
   180  }
   181  
   182  func (service Service) SetLabel(key string, value string) *Service {
   183  	if service.Labels == nil {
   184  		service.Labels = map[string]string{}
   185  	}
   186  	service.Labels[key] = value
   187  	return &service
   188  }
   189  
   190  func (service Service) SetEnvironment(key string, value string) *Service {
   191  	if service.Environment == nil {
   192  		service.Environment = map[string]string{}
   193  	}
   194  	service.Environment[key] = value
   195  	return &service
   196  }