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)
}