internal/compose/compose_other.go (43 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License;
// you may not use this file except in compliance with the Elastic License.
//go:build !windows
package compose
import (
"bytes"
"context"
"fmt"
"io"
"os"
"os/exec"
"github.com/creack/pty"
"github.com/elastic/elastic-package/internal/logger"
)
func (p *Project) runDockerComposeCmd(ctx context.Context, opts dockerComposeOptions) error {
name, args := p.dockerComposeBaseCommand()
args = append(args, opts.args...)
cmd := exec.CommandContext(ctx, name, args...)
cmd.Cancel = func() error {
return cmd.Process.Signal(os.Interrupt)
}
cmd.Env = append(os.Environ(), opts.env...)
var errBuffer bytes.Buffer
var stderr io.Writer = &errBuffer
cmd.Stdout = io.Discard
if logger.IsDebugMode() {
cmd.Stdout = os.Stdout
stderr = io.MultiWriter(&errBuffer, os.Stderr)
}
if opts.stdout != nil {
cmd.Stdout = opts.stdout
}
ptty, err := pty.Start(cmd)
if err != nil {
return fmt.Errorf("failed to start command with pseudo-tty: %w", err)
}
defer ptty.Close()
logger.Debugf("running command: %s", cmd)
io.Copy(stderr, ptty)
if err := cmd.Wait(); err != nil {
if msg := cleanComposeError(errBuffer.String()); len(msg) > 0 {
return fmt.Errorf("%w: %s", err, msg)
}
}
return err
}