mirror of
https://github.com/containers/podman.git
synced 2025-06-06 06:44:53 +08:00

Initial wiring of kpod exec. We wont support the following options for exec: * detach -- unsure of use case * detach-keys -- not supported by runc * interactive -- all terminals will be interactive Not adding exec tests as we need to think about how to support a test that requires console access but our CI tests have no console. Signed-off-by: baude <bbaude@redhat.com>
118 lines
2.7 KiB
Go
118 lines
2.7 KiB
Go
package libpod
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type runcGlobalOptions struct {
|
|
log string
|
|
logFormat string
|
|
root string
|
|
criu string
|
|
systemdCgroup bool
|
|
}
|
|
type runcExecOptions struct {
|
|
consoleSocket string
|
|
cwd string
|
|
env []string
|
|
tty bool
|
|
user string
|
|
processPath string
|
|
detach bool
|
|
pidFile string
|
|
processLabel string
|
|
apparmor string
|
|
noNewPrivs bool
|
|
capAdd []string
|
|
}
|
|
|
|
func parseGlobalOptionsToArgs(opts runcGlobalOptions) []string {
|
|
args := []string{}
|
|
if opts.log != "" {
|
|
args = append(args, "--log", opts.log)
|
|
}
|
|
if opts.logFormat != "" {
|
|
args = append(args, "--log-format", opts.logFormat)
|
|
}
|
|
if opts.root != "" {
|
|
args = append(args, "--root", opts.root)
|
|
}
|
|
if opts.criu != "" {
|
|
args = append(args, "--criu", opts.criu)
|
|
}
|
|
if opts.systemdCgroup {
|
|
args = append(args, "--systemd-cgroup")
|
|
}
|
|
return args
|
|
}
|
|
|
|
// RuncExec executes 'runc --options exec --options cmd'
|
|
func (r *OCIRuntime) RuncExec(container *Container, command []string, globalOpts runcGlobalOptions, execOpts runcExecOptions) error {
|
|
args := []string{}
|
|
args = append(args, parseGlobalOptionsToArgs(globalOpts)...)
|
|
// Add subcommand
|
|
args = append(args, "exec")
|
|
// Now add subcommand args
|
|
|
|
if execOpts.consoleSocket != "" {
|
|
args = append(args, "--console-socket", execOpts.consoleSocket)
|
|
}
|
|
if execOpts.cwd != "" {
|
|
args = append(args, "--cwd", execOpts.cwd)
|
|
}
|
|
|
|
if len(execOpts.env) > 0 {
|
|
for _, envInput := range execOpts.env {
|
|
args = append(args, "--env", envInput)
|
|
}
|
|
}
|
|
if execOpts.tty {
|
|
args = append(args, "--tty")
|
|
}
|
|
if execOpts.user != "" {
|
|
args = append(args, "--user", execOpts.user)
|
|
|
|
}
|
|
if execOpts.processPath != "" {
|
|
args = append(args, "--process", execOpts.processPath)
|
|
}
|
|
if execOpts.detach {
|
|
args = append(args, "--detach")
|
|
}
|
|
if execOpts.pidFile != "" {
|
|
args = append(args, "--pid-file", execOpts.pidFile)
|
|
}
|
|
if execOpts.processLabel != "" {
|
|
args = append(args, "--process-label", execOpts.processLabel)
|
|
}
|
|
if execOpts.apparmor != "" {
|
|
args = append(args, "--apparmor", execOpts.apparmor)
|
|
}
|
|
if execOpts.noNewPrivs {
|
|
args = append(args, "--no-new-privs")
|
|
}
|
|
if len(execOpts.capAdd) > 0 {
|
|
for _, capAddValue := range execOpts.capAdd {
|
|
args = append(args, "--cap", capAddValue)
|
|
}
|
|
}
|
|
|
|
// Append Cid
|
|
args = append(args, container.ID())
|
|
// Append Cmd
|
|
args = append(args, command...)
|
|
|
|
logrus.Debug("Executing runc command: %s %s", r.path, strings.Join(args, " "))
|
|
cmd := exec.Command(r.path, args...)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
cmd.Stdin = os.Stdin
|
|
cmd.Start()
|
|
err := cmd.Wait()
|
|
return err
|
|
}
|