func()

in dev-tools/lib/mage/xbuild/docker.go [83:146]


func (dr *DockerRunner) Exec(
	ctx context.Context,
	cmd clitool.Command,
	args *clitool.Args,
	stdout, stderr io.Writer,
) (bool, error) {
	var dockerArgs = []clitool.ArgOpt{
		clitool.BoolFlag("--rm", !dr.Keep),
		clitool.Flag("-i", ""),
		clitool.Flag("-t", ""),
		clitool.Positional(dr.Image.Image),
	}

	for k, v := range dr.Image.Env {
		dockerArgs = append(dockerArgs, clitool.Flag("-e", fmt.Sprintf("%v=%v", k, v)))
	}

	for k, v := range dr.Image.Volumes {
		dockerArgs = append(dockerArgs, clitool.Flag("-v", fmt.Sprintf("%v:%v", k, v)))
	}

	w := cmd.WorkingDir
	if w == "" {
		w = dr.Image.Workdir
	}
	if w != "" {
		dockerArgs = append(dockerArgs, clitool.Flag("-w", w))
	}

	arguments := args.Build()
	if len(cmd.SubCommand) > 0 {
		tmp := make([]string, 0, len(arguments)+len(cmd.SubCommand))
		tmp = append(tmp, cmd.SubCommand...)
		tmp = append(tmp, arguments...)
		arguments = tmp
	}

	runArgs := append([]string{"run"}, clitool.CreateArgs(dockerArgs...).Build()...)
	runArgs = append(runArgs, cmd.Path)
	runArgs = append(runArgs, arguments...)

	osCommand := exec.CommandContext(ctx, "docker", runArgs...)
	osCommand.Stdout = stdout
	osCommand.Stderr = stderr
	osCommand.Stdin = os.Stdin

	if dr.Verbose {
		fmt.Printf("Exec docker %v\n", runArgs)
	}

	didRun, exitCode, err := checkError(osCommand.Run())
	if err == nil {
		return didRun, nil
	}

	if dr.Verbose {
		fmt.Println("  => exit code:", exitCode)
	}

	if !didRun {
		return false, fmt.Errorf("failed to run command: %+v", err)
	}
	return true, fmt.Errorf("command %v failed with %v: %+v", cmd.Path, exitCode, err)
}