Revert "Revert "Add docker exec run a command in privileged mode""

This reverts commit 40b71adee3.

Original commit (for which this is effectively a rebased version) is
72a500e9e5 and was provided by Lei Jitang
<leijitang@huawei.com>.

Signed-off-by: Tim Dettrick <t.dettrick@uq.edu.au>
This commit is contained in:
Tim Dettrick 2015-06-19 16:01:50 +10:00
parent 650feb29f1
commit 03f65b3d0d
7 changed files with 53 additions and 15 deletions

View File

@ -620,7 +620,7 @@ _docker_exec() {
case "$cur" in case "$cur" in
-*) -*)
COMPREPLY=( $( compgen -W "--detach -d --help --interactive -i -t --tty -u --user" -- "$cur" ) ) COMPREPLY=( $( compgen -W "--detach -d --help --interactive -i --privileged -t --tty -u --user" -- "$cur" ) )
;; ;;
*) *)
__docker_containers_running __docker_containers_running

View File

@ -152,6 +152,7 @@ func (d *Daemon) ContainerExecCreate(config *runconfig.ExecConfig) (string, erro
Entrypoint: entrypoint, Entrypoint: entrypoint,
Arguments: args, Arguments: args,
User: user, User: user,
Privileged: config.Privileged,
} }
execConfig := &execConfig{ execConfig := &execConfig{

View File

@ -19,7 +19,6 @@ import (
// Exec implements the exec driver Driver interface, // Exec implements the exec driver Driver interface,
// it calls libcontainer APIs to execute a container. // it calls libcontainer APIs to execute a container.
// TODO(vishh): Add support for running in privileged mode.
func (d *Driver) Exec(c *execdriver.Command, processConfig *execdriver.ProcessConfig, pipes *execdriver.Pipes, startCallback execdriver.StartCallback) (int, error) { func (d *Driver) Exec(c *execdriver.Command, processConfig *execdriver.ProcessConfig, pipes *execdriver.Pipes, startCallback execdriver.StartCallback) (int, error) {
active := d.activeContainers[c.ID] active := d.activeContainers[c.ID]
if active == nil { if active == nil {
@ -33,6 +32,10 @@ func (d *Driver) Exec(c *execdriver.Command, processConfig *execdriver.ProcessCo
User: processConfig.User, User: processConfig.User,
} }
if processConfig.Privileged {
p.Capabilities = execdriver.GetAllCapabilities()
}
config := active.Config() config := active.Config()
if err := setupPipes(&config, processConfig, p, pipes); err != nil { if err := setupPipes(&config, processConfig, p, pipes); err != nil {
return -1, err return -1, err

View File

@ -17,6 +17,7 @@ weight=1
-d, --detach=false Detached mode: run command in the background -d, --detach=false Detached mode: run command in the background
-i, --interactive=false Keep STDIN open even if not attached -i, --interactive=false Keep STDIN open even if not attached
--privileged=false Give extended privileges to the command
-t, --tty=false Allocate a pseudo-TTY -t, --tty=false Allocate a pseudo-TTY
-u, --user= Username or UID (format: <name|uid>[:<group|gid>]) -u, --user= Username or UID (format: <name|uid>[:<group|gid>])

View File

@ -532,6 +532,31 @@ func (s *DockerSuite) TestExecWithUser(c *check.C) {
} }
} }
func (s *DockerSuite) TestExecWithPrivileged(c *check.C) {
runCmd := exec.Command(dockerBinary, "run", "-d", "--name", "parent", "--cap-drop=ALL", "busybox", "top")
if out, _, err := runCommandWithOutput(runCmd); err != nil {
c.Fatal(out, err)
}
cmd := exec.Command(dockerBinary, "exec", "parent", "sh", "-c", "mknod /tmp/sda b 8 0")
out, _, err := runCommandWithOutput(cmd)
if err == nil || !strings.Contains(out, "Operation not permitted") {
c.Fatalf("exec mknod in --cap-drop=ALL container without --privileged should failed")
}
cmd = exec.Command(dockerBinary, "exec", "--privileged", "parent", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok")
out, _, err = runCommandWithOutput(cmd)
if err != nil {
c.Fatal(err, out)
}
if actual := strings.TrimSpace(out); actual != "ok" {
c.Fatalf("exec mknod in --cap-drop=ALL container with --privileged failed: %v, output: %q", err, out)
}
}
func (s *DockerSuite) TestExecWithImageUser(c *check.C) { func (s *DockerSuite) TestExecWithImageUser(c *check.C) {
name := "testbuilduser" name := "testbuilduser"
_, err := buildImage(name, _, err := buildImage(name,

View File

@ -9,6 +9,7 @@ docker-exec - Run a command in a running container
[**-d**|**--detach**[=*false*]] [**-d**|**--detach**[=*false*]]
[**--help**] [**--help**]
[**-i**|**--interactive**[=*false*]] [**-i**|**--interactive**[=*false*]]
[**--privileged**[=*false*]]
[**-t**|**--tty**[=*false*]] [**-t**|**--tty**[=*false*]]
[**-u**|**--user**[=*USER*]] [**-u**|**--user**[=*USER*]]
CONTAINER COMMAND [ARG...] CONTAINER COMMAND [ARG...]
@ -33,6 +34,13 @@ container is unpaused, and then run
**-i**, **--interactive**=*true*|*false* **-i**, **--interactive**=*true*|*false*
Keep STDIN open even if not attached. The default is *false*. Keep STDIN open even if not attached. The default is *false*.
**--privileged**=*true*|*false*
Give extended privileges to the process to run in a running container. The default is *false*.
By default, the process run by docker exec in a running container
have the same capabilities of the container. By setting --privileged will give
all the capabilities to the process.
**-t**, **--tty**=*true*|*false* **-t**, **--tty**=*true*|*false*
Allocate a pseudo-TTY. The default is *false*. Allocate a pseudo-TTY. The default is *false*.

View File

@ -24,12 +24,13 @@ type ExecConfig struct {
// not valid, it will return an error. // not valid, it will return an error.
func ParseExec(cmd *flag.FlagSet, args []string) (*ExecConfig, error) { func ParseExec(cmd *flag.FlagSet, args []string) (*ExecConfig, error) {
var ( var (
flStdin = cmd.Bool([]string{"i", "-interactive"}, false, "Keep STDIN open even if not attached") flStdin = cmd.Bool([]string{"i", "-interactive"}, false, "Keep STDIN open even if not attached")
flTty = cmd.Bool([]string{"t", "-tty"}, false, "Allocate a pseudo-TTY") flTty = cmd.Bool([]string{"t", "-tty"}, false, "Allocate a pseudo-TTY")
flDetach = cmd.Bool([]string{"d", "-detach"}, false, "Detached mode: run command in the background") flDetach = cmd.Bool([]string{"d", "-detach"}, false, "Detached mode: run command in the background")
flUser = cmd.String([]string{"u", "-user"}, "", "Username or UID (format: <name|uid>[:<group|gid>])") flUser = cmd.String([]string{"u", "-user"}, "", "Username or UID (format: <name|uid>[:<group|gid>])")
execCmd []string flPrivileged = cmd.Bool([]string{"-privileged"}, false, "Give extended privileges to the command")
container string execCmd []string
container string
) )
cmd.Require(flag.Min, 2) cmd.Require(flag.Min, 2)
if err := cmd.ParseFlags(args, true); err != nil { if err := cmd.ParseFlags(args, true); err != nil {
@ -40,13 +41,12 @@ func ParseExec(cmd *flag.FlagSet, args []string) (*ExecConfig, error) {
execCmd = parsedArgs[1:] execCmd = parsedArgs[1:]
execConfig := &ExecConfig{ execConfig := &ExecConfig{
User: *flUser, User: *flUser,
// TODO(vishh): Expose 'Privileged' once it is supported. Privileged: *flPrivileged,
// + //Privileged: job.GetenvBool("Privileged"), Tty: *flTty,
Tty: *flTty, Cmd: execCmd,
Cmd: execCmd, Container: container,
Container: container, Detach: *flDetach,
Detach: *flDetach,
} }
// If -d is not set, attach to everything by default // If -d is not set, attach to everything by default