diff --git a/cli/app/cmd.go b/cli/app/cmd.go index eb4ebcc0..0ada275a 100644 --- a/cli/app/cmd.go +++ b/cli/app/cmd.go @@ -87,7 +87,12 @@ Example: sourceAndExec = fmt.Sprintf("TARGET=local; APP_NAME=%s; STACK_NAME=%s; %s . %s; %s", app.Name, app.StackName(), exportEnv, abraSh, cmdName) } - cmd := exec.Command("/bin/sh", "-c", sourceAndExec) + shell := "/bin/bash" + if _, err := os.Stat(shell); errors.Is(err, os.ErrNotExist) { + logrus.Debugf("%s does not exist locally, use /bin/sh as fallback", shell) + shell = "/bin/sh" + } + cmd := exec.Command(shell, "-c", sourceAndExec) if err := internal.RunCmd(cmd); err != nil { logrus.Fatal(err) @@ -192,34 +197,44 @@ func runCmdRemote(app config.App, abraSh, serviceName, cmdName, cmdArgs string) return err } - var cmd []string - if cmdArgs != "" { - cmd = []string{"/bin/sh", "-c", fmt.Sprintf("TARGET=%s; APP_NAME=%s; STACK_NAME=%s; . /tmp/abra.sh; %s %s", serviceName, app.Name, app.StackName(), cmdName, cmdArgs)} - } else { - cmd = []string{"/bin/sh", "-c", fmt.Sprintf("TARGET=%s; APP_NAME=%s; STACK_NAME=%s; . /tmp/abra.sh; %s", serviceName, app.Name, app.StackName(), cmdName)} + // FIXME: avoid instantiating a new CLI + dcli, err := command.NewDockerCli() + if err != nil { + return err } - logrus.Debugf("running command: %s", strings.Join(cmd, " ")) - + shell := "/bin/bash" + findShell := []string{"test", "-e", shell} execCreateOpts := types.ExecConfig{ AttachStderr: true, AttachStdin: true, AttachStdout: true, - Cmd: cmd, + Cmd: findShell, Detach: false, - Tty: true, + Tty: false, } + if err := container.RunExec(dcli, cl, targetContainer.ID, &execCreateOpts); err != nil { + logrus.Infof("%s does not exist for %s, use /bin/sh as fallback", shell, app.Name) + shell = "/bin/sh" + } + + var cmd []string + if cmdArgs != "" { + cmd = []string{shell, "-c", fmt.Sprintf("TARGET=%s; APP_NAME=%s; STACK_NAME=%s; . /tmp/abra.sh; %s %s", serviceName, app.Name, app.StackName(), cmdName, cmdArgs)} + } else { + cmd = []string{shell, "-c", fmt.Sprintf("TARGET=%s; APP_NAME=%s; STACK_NAME=%s; . /tmp/abra.sh; %s", serviceName, app.Name, app.StackName(), cmdName)} + } + + logrus.Debugf("running command: %s", strings.Join(cmd, " ")) + if internal.RemoteUser != "" { logrus.Debugf("running command with user %s", internal.RemoteUser) execCreateOpts.User = internal.RemoteUser } - // FIXME: avoid instantiating a new CLI - dcli, err := command.NewDockerCli() - if err != nil { - return err - } + execCreateOpts.Cmd = cmd + execCreateOpts.Tty = true if err := container.RunExec(dcli, cl, targetContainer.ID, &execCreateOpts); err != nil { return err