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  }