github.com/grahambrereton-form3/tilt@v0.10.18/internal/minikube/docker.go (about) 1 package minikube 2 3 import ( 4 "bufio" 5 "bytes" 6 "context" 7 "fmt" 8 "os/exec" 9 "regexp" 10 11 "github.com/pkg/errors" 12 ) 13 14 // This isn't perfect (because it won't unquote the value right) but 15 // it's good enough for 99% of cases. 16 var envMatcher = regexp.MustCompile(`export (\w+)="([^"]+)"`) 17 18 type Client interface { 19 DockerEnv(ctx context.Context) (map[string]string, error) 20 } 21 22 func ProvideMinikubeClient() Client { 23 return client{} 24 } 25 26 type client struct{} 27 28 func (client) DockerEnv(ctx context.Context) (map[string]string, error) { 29 cmd := exec.CommandContext(ctx, "minikube", "docker-env", "--shell", "sh") 30 output, err := cmd.Output() 31 if err != nil { 32 exitErr, isExitErr := err.(*exec.ExitError) 33 if isExitErr { 34 // TODO(nick): Maybe we should automatically run minikube start? 35 return nil, fmt.Errorf("Could not read docker env from minikube.\n"+ 36 "Did you forget to run `minikube start`?\n%s", string(exitErr.Stderr)) 37 } 38 39 return nil, errors.Wrap(err, "Could not read docker env from minikube") 40 } 41 return dockerEnvFromOutput(output) 42 } 43 44 func dockerEnvFromOutput(output []byte) (map[string]string, error) { 45 result := make(map[string]string) 46 scanner := bufio.NewScanner(bytes.NewBuffer(output)) 47 for scanner.Scan() { 48 line := scanner.Text() 49 50 match := envMatcher.FindStringSubmatch(line) 51 if len(match) > 0 { 52 result[match[1]] = match[2] 53 } 54 } 55 56 return result, nil 57 }