github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/cli/docker.go (about)

     1  package cli
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  	"os/exec"
     8  	"strings"
     9  	"time"
    10  
    11  	"github.com/docker/docker/api/types"
    12  	"github.com/pkg/errors"
    13  	"github.com/spf13/cobra"
    14  
    15  	"github.com/tilt-dev/tilt/internal/analytics"
    16  	"github.com/tilt-dev/tilt/pkg/model"
    17  )
    18  
    19  type dockerCmd struct {
    20  }
    21  
    22  func (c *dockerCmd) name() model.TiltSubcommand { return "docker" }
    23  
    24  func (c *dockerCmd) register() *cobra.Command {
    25  	cmd := &cobra.Command{
    26  		Use:     "docker [flags] -- command ...",
    27  		Short:   "Execute Docker commands as Tilt would execute them",
    28  		Example: "tilt docker -- build -f path/to/Dockerfile .",
    29  	}
    30  	return cmd
    31  }
    32  
    33  func (c *dockerCmd) run(ctx context.Context, args []string) error {
    34  	a := analytics.Get(ctx)
    35  	a.Incr("cmd.docker", map[string]string{})
    36  	defer a.Flush(time.Second)
    37  
    38  	client, err := wireDockerClusterClient(ctx)
    39  	if err != nil {
    40  		return errors.Wrap(err, "Failed to init Docker client")
    41  	}
    42  
    43  	err = client.CheckConnected()
    44  	if err != nil {
    45  		return errors.Wrap(err, "Failed to connect to Docker server")
    46  	}
    47  
    48  	dockerEnv := client.Env()
    49  	builder, err := client.BuilderVersion(ctx)
    50  	if err != nil {
    51  		return errors.Wrap(err, "Failed to get Docker builder")
    52  	}
    53  
    54  	buildkitEnv := "DOCKER_BUILDKIT=0"
    55  	if builder == types.BuilderBuildKit {
    56  		buildkitEnv = "DOCKER_BUILDKIT=1"
    57  	}
    58  	env := append([]string{buildkitEnv}, dockerEnv.AsEnviron()...)
    59  	fmt.Fprintf(os.Stderr,
    60  		"Running Docker command as:\n%s docker %s\n---\n",
    61  		strings.Join(env, " "),
    62  		strings.Join(args, " "))
    63  
    64  	cmd := exec.Command("docker", args...)
    65  	cmd.Env = append(os.Environ(), env...)
    66  	cmd.Stdout = os.Stdout
    67  	cmd.Stderr = os.Stderr
    68  	return cmd.Run()
    69  }