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 }