func (b *DockerBox) binds(env *util.Environment) ([]string, error) { binds := []string{} // Make our list of binds for the Docker attach // NOTE(termie): we don't appear to need the "volumes" stuff, leaving // it commented out in case it actually does something // volumes := make(map[string]struct{}) entries, err := ioutil.ReadDir(b.options.HostPath()) if err != nil { return nil, err } for _, entry := range entries { if entry.IsDir() || entry.Mode()&os.ModeSymlink == os.ModeSymlink { // For local dev we can mount read-write and avoid a copy, so we'll mount // directly in the pipeline path if b.options.DirectMount { binds = append(binds, fmt.Sprintf("%s:%s:rw", b.options.HostPath(entry.Name()), b.options.GuestPath(entry.Name()))) } else { binds = append(binds, fmt.Sprintf("%s:%s:ro", b.options.HostPath(entry.Name()), b.options.MntPath(entry.Name()))) } // volumes[b.options.MntPath(entry.Name())] = struct{}{} } } if b.options.EnableVolumes { vols := util.SplitSpaceOrComma(b.config.Volumes) var interpolatedVols []string for _, vol := range vols { if strings.Contains(vol, ":") { pair := strings.SplitN(vol, ":", 2) interpolatedVols = append(interpolatedVols, env.Interpolate(pair[0])) interpolatedVols = append(interpolatedVols, env.Interpolate(pair[1])) } else { interpolatedVols = append(interpolatedVols, env.Interpolate(vol)) interpolatedVols = append(interpolatedVols, env.Interpolate(vol)) } } b.volumes = interpolatedVols for i := 0; i < len(b.volumes); i += 2 { binds = append(binds, fmt.Sprintf("%s:%s:rw", b.volumes[i], b.volumes[i+1])) } } return binds, nil }
// InitEnv parses our data into our config func (s *DockerPushStep) InitEnv(env *util.Environment) { if username, ok := s.data["username"]; ok { s.username = env.Interpolate(username) } if password, ok := s.data["password"]; ok { s.password = env.Interpolate(password) } if email, ok := s.data["email"]; ok { s.email = env.Interpolate(email) } if authServer, ok := s.data["auth-server"]; ok { s.authServer = env.Interpolate(authServer) } if repository, ok := s.data["repository"]; ok { s.repository = env.Interpolate(repository) } if tags, ok := s.data["tag"]; ok { splitTags := util.SplitSpaceOrComma(tags) interpolatedTags := make([]string, len(splitTags)) for i, tag := range splitTags { interpolatedTags[i] = env.Interpolate(tag) } s.tags = interpolatedTags } if author, ok := s.data["author"]; ok { s.author = env.Interpolate(author) } if message, ok := s.data["message"]; ok { s.message = env.Interpolate(message) } if ports, ok := s.data["ports"]; ok { iPorts := env.Interpolate(ports) parts := util.SplitSpaceOrComma(iPorts) portmap := make(map[docker.Port]struct{}) for _, port := range parts { port = strings.TrimSpace(port) if !strings.Contains(port, "/") { port = port + "/tcp" } portmap[docker.Port(port)] = struct{}{} } s.ports = portmap } if volumes, ok := s.data["volumes"]; ok { iVolumes := env.Interpolate(volumes) parts := util.SplitSpaceOrComma(iVolumes) volumemap := make(map[string]struct{}) for _, volume := range parts { volume = strings.TrimSpace(volume) volumemap[volume] = struct{}{} } s.volumes = volumemap } if workingDir, ok := s.data["working-dir"]; ok { s.workingDir = env.Interpolate(workingDir) } if registry, ok := s.data["registry"]; ok { // s.registry = env.Interpolate(registry) s.registry = normalizeRegistry(env.Interpolate(registry)) } else { // s.registry = "https://registry.hub.docker.com" s.registry = normalizeRegistry("https://registry.hub.docker.com") } if cmd, ok := s.data["cmd"]; ok { parts, err := shlex.Split(cmd) if err == nil { s.cmd = parts } } if entrypoint, ok := s.data["entrypoint"]; ok { parts, err := shlex.Split(entrypoint) if err == nil { s.entrypoint = parts } } if envi, ok := s.data["env"]; ok { parsedEnv, err := shlex.Split(envi) if err == nil { interpolatedEnv := make([]string, len(parsedEnv)) for i, envVar := range parsedEnv { interpolatedEnv[i] = env.Interpolate(envVar) } s.env = interpolatedEnv } } if stopsignal, ok := s.data["stopsignal"]; ok { s.stopSignal = env.Interpolate(stopsignal) } if labels, ok := s.data["labels"]; ok { parsedLabels, err := shlex.Split(labels) if err == nil { labelMap := make(map[string]string) for _, labelPair := range parsedLabels { pair := strings.Split(labelPair, "=") labelMap[env.Interpolate(pair[0])] = env.Interpolate(pair[1]) } s.labels = labelMap } } if user, ok := s.data["user"]; ok { s.user = env.Interpolate(user) } if forceTags, ok := s.data["force-tags"]; ok { ft, err := strconv.ParseBool(forceTags) if err == nil { s.forceTags = ft } } else { s.forceTags = true } }
// InitEnv parses our data into our config func (s *DockerPushStep) InitEnv(env *util.Environment) { if email, ok := s.data["email"]; ok { s.email = env.Interpolate(email) } if authServer, ok := s.data["auth-server"]; ok { s.authServer = env.Interpolate(authServer) } if repository, ok := s.data["repository"]; ok { s.repository = env.Interpolate(repository) } if tags, ok := s.data["tag"]; ok { splitTags := util.SplitSpaceOrComma(tags) interpolatedTags := make([]string, len(splitTags)) for i, tag := range splitTags { interpolatedTags[i] = env.Interpolate(tag) } s.tags = interpolatedTags } if author, ok := s.data["author"]; ok { s.author = env.Interpolate(author) } if message, ok := s.data["message"]; ok { s.message = env.Interpolate(message) } if ports, ok := s.data["ports"]; ok { iPorts := env.Interpolate(ports) parts := util.SplitSpaceOrComma(iPorts) portmap := make(map[docker.Port]struct{}) for _, port := range parts { port = strings.TrimSpace(port) if !strings.Contains(port, "/") { port = port + "/tcp" } portmap[docker.Port(port)] = struct{}{} } s.ports = portmap } if volumes, ok := s.data["volumes"]; ok { iVolumes := env.Interpolate(volumes) parts := util.SplitSpaceOrComma(iVolumes) volumemap := make(map[string]struct{}) for _, volume := range parts { volume = strings.TrimSpace(volume) volumemap[volume] = struct{}{} } s.volumes = volumemap } if workingDir, ok := s.data["working-dir"]; ok { s.workingDir = env.Interpolate(workingDir) } if cmd, ok := s.data["cmd"]; ok { parts, err := shlex.Split(cmd) if err == nil { s.cmd = parts } } if entrypoint, ok := s.data["entrypoint"]; ok { parts, err := shlex.Split(entrypoint) if err == nil { s.entrypoint = parts } } if envi, ok := s.data["env"]; ok { parsedEnv, err := shlex.Split(envi) if err == nil { interpolatedEnv := make([]string, len(parsedEnv)) for i, envVar := range parsedEnv { interpolatedEnv[i] = env.Interpolate(envVar) } s.env = interpolatedEnv } } if stopsignal, ok := s.data["stopsignal"]; ok { s.stopSignal = env.Interpolate(stopsignal) } if labels, ok := s.data["labels"]; ok { parsedLabels, err := shlex.Split(labels) if err == nil { labelMap := make(map[string]string) for _, labelPair := range parsedLabels { pair := strings.Split(labelPair, "=") labelMap[env.Interpolate(pair[0])] = env.Interpolate(pair[1]) } s.labels = labelMap } } if user, ok := s.data["user"]; ok { s.user = env.Interpolate(user) } if forceTags, ok := s.data["force-tags"]; ok { ft, err := strconv.ParseBool(forceTags) if err == nil { s.forceTags = ft } } else { s.forceTags = true } //build auther opts := dockerauth.CheckAccessOptions{} if username, ok := s.data["username"]; ok { opts.Username = env.Interpolate(username) } if password, ok := s.data["password"]; ok { opts.Password = env.Interpolate(password) } if awsAccessKey, ok := s.data["aws-access-key"]; ok { opts.AwsAccessKey = env.Interpolate(awsAccessKey) } if awsSecretKey, ok := s.data["aws-secret-key"]; ok { opts.AwsSecretKey = env.Interpolate(awsSecretKey) } if awsRegion, ok := s.data["aws-region"]; ok { opts.AwsRegion = env.Interpolate(awsRegion) } if awsAuth, ok := s.data["aws-strict-auth"]; ok { auth, err := strconv.ParseBool(awsAuth) if err == nil { opts.AwsStrictAuth = auth } } if awsRegistryID, ok := s.data["aws-registry-id"]; ok { opts.AwsRegistryID = env.Interpolate(awsRegistryID) } if registry, ok := s.data["registry"]; ok { opts.Registry = dockerauth.NormalizeRegistry(env.Interpolate(registry)) } auther, _ := dockerauth.GetRegistryAuthenticator(opts) s.authenticator = auther }