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 }