diff --git a/daemon/container_unix.go b/daemon/container_unix.go index cc730e4c40..86238d819a 100644 --- a/daemon/container_unix.go +++ b/daemon/container_unix.go @@ -301,6 +301,10 @@ func populateCommand(c *Container, env []string) error { AutoCreatedDevices: autoCreatedDevices, CapAdd: c.hostConfig.CapAdd.Slice(), CapDrop: c.hostConfig.CapDrop.Slice(), + GroupAdd: c.hostConfig.GroupAdd.Slice(), + CapAdd: c.hostConfig.CapAdd, + CapDrop: c.hostConfig.CapDrop, + GroupAdd: c.hostConfig.GroupAdd, ProcessConfig: processConfig, ProcessLabel: c.GetProcessLabel(), MountLabel: c.GetMountLabel(), diff --git a/daemon/execdriver/driver.go b/daemon/execdriver/driver.go index c470ad408e..128d3ea10b 100644 --- a/daemon/execdriver/driver.go +++ b/daemon/execdriver/driver.go @@ -170,6 +170,7 @@ type Command struct { AutoCreatedDevices []*configs.Device `json:"autocreated_devices"` CapAdd []string `json:"cap_add"` CapDrop []string `json:"cap_drop"` + GroupAdd []string `json:"group_add"` ContainerPid int `json:"container_pid"` // the pid for the process inside a container ProcessConfig ProcessConfig `json:"process_config"` // Describes the init process of the container. ProcessLabel string `json:"process_label"` diff --git a/daemon/execdriver/native/create.go b/daemon/execdriver/native/create.go index a8adda6ded..a9328408ca 100644 --- a/daemon/execdriver/native/create.go +++ b/daemon/execdriver/native/create.go @@ -58,6 +58,8 @@ func (d *driver) createContainer(c *execdriver.Command) (*configs.Config, error) } } + container.AdditionalGroups = c.GroupAdd + if c.AppArmorProfile != "" { container.AppArmorProfile = c.AppArmorProfile } diff --git a/runconfig/hostconfig.go b/runconfig/hostconfig.go index 9264d9ae9b..21b40dc104 100644 --- a/runconfig/hostconfig.go +++ b/runconfig/hostconfig.go @@ -249,6 +249,7 @@ type HostConfig struct { UTSMode UTSMode CapAdd *CapList CapDrop *CapList + GroupAdd []string RestartPolicy RestartPolicy SecurityOpt []string ReadonlyRootfs bool diff --git a/runconfig/parse.go b/runconfig/parse.go index ed6917acb3..e849daf374 100644 --- a/runconfig/parse.go +++ b/runconfig/parse.go @@ -60,6 +60,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe flEnvFile = opts.NewListOpts(nil) flCapAdd = opts.NewListOpts(nil) flCapDrop = opts.NewListOpts(nil) + flGroupAdd = opts.NewListOpts(nil) flSecurityOpt = opts.NewListOpts(nil) flLabelsFile = opts.NewListOpts(nil) flLoggingOpts = opts.NewListOpts(nil) @@ -112,6 +113,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe cmd.Var(&flLxcOpts, []string{"#lxc-conf", "-lxc-conf"}, "Add custom lxc options") cmd.Var(&flCapAdd, []string{"-cap-add"}, "Add Linux capabilities") cmd.Var(&flCapDrop, []string{"-cap-drop"}, "Drop Linux capabilities") + cmd.Var(&flGroupAdd, []string{"-group-add"}, "Add additional groups to join") cmd.Var(&flSecurityOpt, []string{"-security-opt"}, "Security Options") cmd.Var(flUlimits, []string{"-ulimit"}, "Ulimit options") cmd.Var(&flLoggingOpts, []string{"-log-opt"}, "Log driver options") @@ -369,6 +371,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe Devices: deviceMappings, CapAdd: NewCapList(flCapAdd.GetAll()), CapDrop: NewCapList(flCapDrop.GetAll()), + GroupAdd: flGroupAdd.GetAll(), RestartPolicy: restartPolicy, SecurityOpt: flSecurityOpt.GetAll(), ReadonlyRootfs: *flReadonlyRootfs,