Browse code

Remove exec-driver global daemon option.

Each platform has only a driver now.

Signed-off-by: David Calavera <david.calavera@gmail.com>

David Calavera authored on 2015/11/05 09:40:58
Showing 29 changed files
... ...
@@ -264,7 +264,6 @@ type ContainerJSONBase struct {
264 264
 	Name            string
265 265
 	RestartCount    int
266 266
 	Driver          string
267
-	ExecDriver      string
268 267
 	MountLabel      string
269 268
 	ProcessLabel    string
270 269
 	AppArmorProfile string
... ...
@@ -659,7 +659,6 @@ _docker_daemon() {
659 659
 		--dns
660 660
 		--dns-search
661 661
 		--dns-opt
662
-		--exec-driver -e
663 662
 		--exec-opt
664 663
 		--exec-root
665 664
 		--fixed-cidr
... ...
@@ -51,7 +51,6 @@ complete -c docker -f -n '__fish_docker_no_subcommand' -s d -l daemon -d 'Enable
51 51
 complete -c docker -f -n '__fish_docker_no_subcommand' -l dns -d 'Force Docker to use specific DNS servers'
52 52
 complete -c docker -f -n '__fish_docker_no_subcommand' -l dns-opt -d 'Force Docker to use specific DNS options'
53 53
 complete -c docker -f -n '__fish_docker_no_subcommand' -l dns-search -d 'Force Docker to use specific DNS search domains'
54
-complete -c docker -f -n '__fish_docker_no_subcommand' -s e -l exec-driver -d 'Force the Docker runtime to use a specific exec driver'
55 54
 complete -c docker -f -n '__fish_docker_no_subcommand' -l exec-opt -d 'Set exec driver options'
56 55
 complete -c docker -f -n '__fish_docker_no_subcommand' -l fixed-cidr -d 'IPv4 subnet for fixed IPs (e.g. 10.20.0.0/16)'
57 56
 complete -c docker -f -n '__fish_docker_no_subcommand' -l fixed-cidr-v6 -d 'IPv6 subnet for fixed IPs (e.g.: 2001:a02b/48)'
... ...
@@ -540,7 +540,6 @@ __docker_subcommand() {
540 540
                 "($help)*--dns-opt=[DNS options to use]:DNS option: " \
541 541
                 "($help)*--default-ulimit=[Set default ulimit settings for containers]:ulimit: " \
542 542
                 "($help)--disable-legacy-registry[Do not contact legacy registries]" \
543
-                "($help -e --exec-driver)"{-e=,--exec-driver=}"[Exec driver to use]:driver:(native windows)" \
544 543
                 "($help)*--exec-opt=[Set exec driver options]:exec driver options: " \
545 544
                 "($help)--exec-root=[Root of the Docker execdriver]:path:_directories" \
546 545
                 "($help)--fixed-cidr=[IPv4 subnet for fixed IPs]:IPv4 subnet: " \
... ...
@@ -21,7 +21,6 @@ type CommonConfig struct {
21 21
 	DNS            []string
22 22
 	DNSOptions     []string
23 23
 	DNSSearch      []string
24
-	ExecDriver     string
25 24
 	ExecOptions    []string
26 25
 	ExecRoot       string
27 26
 	GraphDriver    string
... ...
@@ -62,7 +61,6 @@ func (config *Config) InstallCommonFlags(cmd *flag.FlagSet, usageFn func(string)
62 62
 	cmd.StringVar(&config.ExecRoot, []string{"-exec-root"}, "/var/run/docker", usageFn("Root of the Docker execdriver"))
63 63
 	cmd.BoolVar(&config.AutoRestart, []string{"#r", "#-restart"}, true, usageFn("--restart on the daemon has been deprecated in favor of --restart policies on docker run"))
64 64
 	cmd.StringVar(&config.GraphDriver, []string{"s", "-storage-driver"}, "", usageFn("Storage driver to use"))
65
-	cmd.StringVar(&config.ExecDriver, []string{"e", "-exec-driver"}, defaultExec, usageFn("Exec driver to use"))
66 65
 	cmd.IntVar(&config.Mtu, []string{"#mtu", "-mtu"}, 0, usageFn("Set the containers network MTU"))
67 66
 	// FIXME: why the inconsistency between "hosts" and "sockets"?
68 67
 	cmd.Var(opts.NewListOptsRef(&config.DNS, opts.ValidateIPAddress), []string{"#dns", "-dns"}, usageFn("DNS server to use"))
... ...
@@ -63,7 +63,6 @@ type CommonContainer struct {
63 63
 	LogPath         string
64 64
 	Name            string
65 65
 	Driver          string
66
-	ExecDriver      string
67 66
 	// MountLabel contains the options for the 'mount' command
68 67
 	MountLabel             string
69 68
 	ProcessLabel           string
... ...
@@ -489,7 +489,6 @@ func (daemon *Daemon) newContainer(name string, config *runconfig.Config, imgID
489 489
 	base.NetworkSettings = &network.Settings{IsAnonymousEndpoint: noExplicitName}
490 490
 	base.Name = name
491 491
 	base.Driver = daemon.driver.String()
492
-	base.ExecDriver = daemon.execDriver.Name()
493 492
 
494 493
 	return base, err
495 494
 }
... ...
@@ -793,7 +792,7 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo
793 793
 		return nil, fmt.Errorf("Devices cgroup isn't mounted")
794 794
 	}
795 795
 
796
-	ed, err := execdrivers.NewDriver(config.ExecDriver, config.ExecOptions, config.ExecRoot, config.Root, sysInitPath, sysInfo)
796
+	ed, err := execdrivers.NewDriver(config.ExecOptions, config.ExecRoot, config.Root, sysInitPath, sysInfo)
797 797
 	if err != nil {
798 798
 		return nil, err
799 799
 	}
... ...
@@ -15,11 +15,8 @@ import (
15 15
 )
16 16
 
17 17
 func setupRemappedRoot(config *Config) ([]idtools.IDMap, []idtools.IDMap, error) {
18
-	if config.ExecDriver != "native" && config.RemappedRoot != "" {
19
-		return nil, nil, fmt.Errorf("User namespace remapping is only supported with the native execdriver")
20
-	}
21
-	if runtime.GOOS == "windows" && config.RemappedRoot != "" {
22
-		return nil, nil, fmt.Errorf("User namespaces are not supported on Windows")
18
+	if runtime.GOOS != "linux" && config.RemappedRoot != "" {
19
+		return nil, nil, fmt.Errorf("User namespaces are not supported on Linux")
23 20
 	}
24 21
 
25 22
 	// if the daemon was started with remapped root option, parse
... ...
@@ -166,7 +166,7 @@ func TestLoadWithVolume(t *testing.T) {
166 166
 "HostnamePath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/hostname",
167 167
 "HostsPath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/hosts",
168 168
 "LogPath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e-json.log",
169
-"Name":"/ubuntu","Driver":"aufs","ExecDriver":"native-0.2","MountLabel":"","ProcessLabel":"","AppArmorProfile":"","RestartCount":0,
169
+"Name":"/ubuntu","Driver":"aufs","MountLabel":"","ProcessLabel":"","AppArmorProfile":"","RestartCount":0,
170 170
 "UpdateDns":false,"Volumes":{"/vol1":"%s"},"VolumesRW":{"/vol1":true},"AppliedVolumesFrom":null}`
171 171
 
172 172
 	cfg := fmt.Sprintf(config, vfsPath)
... ...
@@ -255,7 +255,7 @@ func TestLoadWithBindMount(t *testing.T) {
255 255
 "HostnamePath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/hostname",
256 256
 "HostsPath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/hosts",
257 257
 "LogPath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e-json.log",
258
-"Name":"/ubuntu","Driver":"aufs","ExecDriver":"native-0.2","MountLabel":"","ProcessLabel":"","AppArmorProfile":"","RestartCount":0,
258
+"Name":"/ubuntu","Driver":"aufs","MountLabel":"","ProcessLabel":"","AppArmorProfile":"","RestartCount":0,
259 259
 "UpdateDns":false,"Volumes":{"/vol1": "/vol1"},"VolumesRW":{"/vol1":true},"AppliedVolumesFrom":null}`
260 260
 
261 261
 	if err = ioutil.WriteFile(filepath.Join(containerPath, "config.json"), []byte(config), 0644); err != nil {
... ...
@@ -346,7 +346,7 @@ func TestLoadWithVolume17RC(t *testing.T) {
346 346
 "HostnamePath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/hostname",
347 347
 "HostsPath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/hosts",
348 348
 "LogPath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e-json.log",
349
-"Name":"/ubuntu","Driver":"aufs","ExecDriver":"native-0.2","MountLabel":"","ProcessLabel":"","AppArmorProfile":"","RestartCount":0,
349
+"Name":"/ubuntu","Driver":"aufs","MountLabel":"","ProcessLabel":"","AppArmorProfile":"","RestartCount":0,
350 350
 "UpdateDns":false,"MountPoints":{"/vol1":{"Name":"6a3c03fc4a4e588561a543cc3bdd50089e27bd11bbb0e551e19bf735e2514101","Destination":"/vol1","Driver":"local","RW":true,"Source":"","Relabel":""}},"AppliedVolumesFrom":null}`
351 351
 
352 352
 	if err = ioutil.WriteFile(filepath.Join(containerPath, "config.json"), []byte(config), 0644); err != nil {
... ...
@@ -450,7 +450,7 @@ func TestRemoveLocalVolumesFollowingSymlinks(t *testing.T) {
450 450
 "HostnamePath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/hostname",
451 451
 "HostsPath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/hosts",
452 452
 "LogPath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e-json.log",
453
-"Name":"/ubuntu","Driver":"aufs","ExecDriver":"native-0.2","MountLabel":"","ProcessLabel":"","AppArmorProfile":"","RestartCount":0,
453
+"Name":"/ubuntu","Driver":"aufs","MountLabel":"","ProcessLabel":"","AppArmorProfile":"","RestartCount":0,
454 454
 "UpdateDns":false,"Volumes":{"/vol1":"%s"},"VolumesRW":{"/vol1":true},"AppliedVolumesFrom":null}`
455 455
 
456 456
 	cfg := fmt.Sprintf(config, vfsPath)
... ...
@@ -10,10 +10,6 @@ import (
10 10
 )
11 11
 
12 12
 // NewDriver returns a new execdriver.Driver from the given name configured with the provided options.
13
-func NewDriver(name string, options []string, root, libPath, initPath string, sysInfo *sysinfo.SysInfo) (execdriver.Driver, error) {
14
-	switch name {
15
-	case "jail":
16
-		return nil, fmt.Errorf("jail driver not yet supported on FreeBSD")
17
-	}
18
-	return nil, fmt.Errorf("unknown exec driver %s", name)
13
+func NewDriver(options []string, root, libPath, initPath string, sysInfo *sysinfo.SysInfo) (execdriver.Driver, error) {
14
+	return nil, fmt.Errorf("jail driver not yet supported on FreeBSD")
19 15
 }
... ...
@@ -3,7 +3,6 @@
3 3
 package execdrivers
4 4
 
5 5
 import (
6
-	"fmt"
7 6
 	"path"
8 7
 
9 8
 	"github.com/docker/docker/daemon/execdriver"
... ...
@@ -12,9 +11,6 @@ import (
12 12
 )
13 13
 
14 14
 // NewDriver returns a new execdriver.Driver from the given name configured with the provided options.
15
-func NewDriver(name string, options []string, root, libPath, initPath string, sysInfo *sysinfo.SysInfo) (execdriver.Driver, error) {
16
-	if name != "native" {
17
-		return nil, fmt.Errorf("unknown exec driver %s", name)
18
-	}
15
+func NewDriver(options []string, root, libPath, initPath string, sysInfo *sysinfo.SysInfo) (execdriver.Driver, error) {
19 16
 	return native.NewDriver(path.Join(root, "execdriver", "native"), initPath, options)
20 17
 }
... ...
@@ -3,18 +3,12 @@
3 3
 package execdrivers
4 4
 
5 5
 import (
6
-	"fmt"
7
-
8 6
 	"github.com/docker/docker/daemon/execdriver"
9 7
 	"github.com/docker/docker/daemon/execdriver/windows"
10 8
 	"github.com/docker/docker/pkg/sysinfo"
11 9
 )
12 10
 
13 11
 // NewDriver returns a new execdriver.Driver from the given name configured with the provided options.
14
-func NewDriver(name string, options []string, root, libPath, initPath string, sysInfo *sysinfo.SysInfo) (execdriver.Driver, error) {
15
-	switch name {
16
-	case "windows":
17
-		return windows.NewDriver(root, initPath, options)
18
-	}
19
-	return nil, fmt.Errorf("unknown exec driver %s", name)
12
+func NewDriver(options []string, root, libPath, initPath string, sysInfo *sysinfo.SysInfo) (execdriver.Driver, error) {
13
+	return windows.NewDriver(root, initPath, options)
20 14
 }
... ...
@@ -128,7 +128,6 @@ func (daemon *Daemon) getInspectData(container *Container, size bool) (*types.Co
128 128
 		Name:         container.Name,
129 129
 		RestartCount: container.RestartCount,
130 130
 		Driver:       container.Driver,
131
-		ExecDriver:   container.ExecDriver,
132 131
 		MountLabel:   container.MountLabel,
133 132
 		ProcessLabel: container.ProcessLabel,
134 133
 		ExecIDs:      container.getExecIDs(),
... ...
@@ -672,8 +672,6 @@ Status Codes:
672 672
 
673 673
 This endpoint returns a live stream of a container's resource usage statistics.
674 674
 
675
-> **Note**: this functionality currently only works when using the *libcontainer* exec-driver.
676
-
677 675
 **Example request**:
678 676
 
679 677
     GET /containers/redis1/stats HTTP/1.1
... ...
@@ -29,7 +29,6 @@ weight = -1
29 29
       --dns-opt=[]                           DNS options to use
30 30
       --dns-search=[]                        DNS search domains to use
31 31
       --default-ulimit=[]                    Set default ulimit settings for containers
32
-      -e, --exec-driver="native"             Exec driver to use
33 32
       --exec-opt=[]                          Set exec driver options
34 33
       --exec-root="/var/run/docker"          Root of the Docker execdriver
35 34
       --fixed-cidr=""                        IPv4 subnet for fixed IPs
... ...
@@ -13,7 +13,6 @@ fi
13 13
 exec 41>&1 42>&2
14 14
 
15 15
 export DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs}
16
-export DOCKER_EXECDRIVER=${DOCKER_EXECDRIVER:-native}
17 16
 export DOCKER_USERLANDPROXY=${DOCKER_USERLANDPROXY:-true}
18 17
 
19 18
 # example usage: DOCKER_STORAGE_OPTS="dm.basesize=20G,dm.loopdatasize=200G"
... ...
@@ -49,7 +48,6 @@ if [ -z "$DOCKER_TEST_HOST" ]; then
49 49
 		docker daemon --debug \
50 50
 		--host "$DOCKER_HOST" \
51 51
 		--storage-driver "$DOCKER_GRAPHDRIVER" \
52
-		--exec-driver "$DOCKER_EXECDRIVER" \
53 52
 		--pidfile "$DEST/docker.pid" \
54 53
 		--userland-proxy="$DOCKER_USERLANDPROXY" \
55 54
 		$storage_params \
... ...
@@ -27,7 +27,6 @@ func (s *DockerSuite) TestExecResizeApiHeightWidthNoInt(c *check.C) {
27 27
 // Part of #14845
28 28
 func (s *DockerSuite) TestExecResizeImmediatelyAfterExecStart(c *check.C) {
29 29
 	testRequires(c, DaemonIsLinux)
30
-	testRequires(c, NativeExecDriver)
31 30
 
32 31
 	name := "exec_resize_test"
33 32
 	dockerCmd(c, "run", "-d", "-i", "-t", "--name", name, "--restart", "always", "busybox", "/bin/sh")
... ...
@@ -18,7 +18,7 @@ func (s *DockerSuite) TestInspectApiContainerResponse(c *check.C) {
18 18
 
19 19
 	cleanedContainerID := strings.TrimSpace(out)
20 20
 	keysBase := []string{"Id", "State", "Created", "Path", "Args", "Config", "Image", "NetworkSettings",
21
-		"ResolvConfPath", "HostnamePath", "HostsPath", "LogPath", "Name", "Driver", "ExecDriver", "MountLabel", "ProcessLabel", "GraphDriver"}
21
+		"ResolvConfPath", "HostnamePath", "HostsPath", "LogPath", "Name", "Driver", "MountLabel", "ProcessLabel", "GraphDriver"}
22 22
 
23 23
 	cases := []struct {
24 24
 		version string
... ...
@@ -5459,7 +5459,6 @@ func (s *DockerSuite) TestBuildEmptyStringVolume(c *check.C) {
5459 5459
 }
5460 5460
 
5461 5461
 func (s *DockerSuite) TestBuildContainerWithCgroupParent(c *check.C) {
5462
-	testRequires(c, NativeExecDriver)
5463 5462
 	testRequires(c, SameHostDaemon)
5464 5463
 	testRequires(c, DaemonIsLinux)
5465 5464
 
... ...
@@ -870,7 +870,7 @@ func (s *DockerDaemonSuite) TestDaemonDefaultGatewayIPv4ExplicitOutsideContainer
870 870
 }
871 871
 
872 872
 func (s *DockerDaemonSuite) TestDaemonDefaultNetworkInvalidClusterConfig(c *check.C) {
873
-	testRequires(c, SameHostDaemon)
873
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
874 874
 
875 875
 	// Start daemon without docker0 bridge
876 876
 	defaultNetworkBridge := "docker0"
... ...
@@ -1032,7 +1032,7 @@ func (s *DockerDaemonSuite) TestDaemonLinksIpTablesRulesWhenLinkAndUnlink(c *che
1032 1032
 }
1033 1033
 
1034 1034
 func (s *DockerDaemonSuite) TestDaemonUlimitDefaults(c *check.C) {
1035
-	testRequires(c, NativeExecDriver)
1035
+	testRequires(c, DaemonIsLinux)
1036 1036
 
1037 1037
 	if err := s.d.StartWithBusybox("--default-ulimit", "nofile=42:42", "--default-ulimit", "nproc=1024:1024"); err != nil {
1038 1038
 		c.Fatal(err)
... ...
@@ -1527,7 +1527,7 @@ func (s *DockerDaemonSuite) TestCleanupMountsAfterCrash(c *check.C) {
1527 1527
 }
1528 1528
 
1529 1529
 func (s *DockerDaemonSuite) TestRunContainerWithBridgeNone(c *check.C) {
1530
-	testRequires(c, NativeExecDriver, NotUserNamespace)
1530
+	testRequires(c, DaemonIsLinux, NotUserNamespace)
1531 1531
 	c.Assert(s.d.StartWithBusybox("-b", "none"), check.IsNil)
1532 1532
 
1533 1533
 	out, err := s.d.Cmd("run", "--rm", "busybox", "ip", "l")
... ...
@@ -47,7 +47,6 @@ func (s *DockerSuite) TestEventsRedirectStdout(c *check.C) {
47 47
 
48 48
 func (s *DockerSuite) TestEventsOOMDisableFalse(c *check.C) {
49 49
 	testRequires(c, DaemonIsLinux)
50
-	testRequires(c, NativeExecDriver)
51 50
 	testRequires(c, oomControl)
52 51
 	testRequires(c, NotGCCGO)
53 52
 
... ...
@@ -84,7 +83,6 @@ func (s *DockerSuite) TestEventsOOMDisableFalse(c *check.C) {
84 84
 
85 85
 func (s *DockerSuite) TestEventsOOMDisableTrue(c *check.C) {
86 86
 	testRequires(c, DaemonIsLinux)
87
-	testRequires(c, NativeExecDriver)
88 87
 	testRequires(c, oomControl)
89 88
 	testRequires(c, NotGCCGO)
90 89
 
... ...
@@ -32,8 +32,7 @@ func (s *DockerSuite) TestExperimentalVersion(c *check.C) {
32 32
 // 1. validate uid/gid maps are set properly
33 33
 // 2. verify that files created are owned by remapped root
34 34
 func (s *DockerDaemonSuite) TestDaemonUserNamespaceRootSetting(c *check.C) {
35
-	testRequires(c, NativeExecDriver)
36
-	testRequires(c, SameHostDaemon)
35
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
37 36
 
38 37
 	c.Assert(s.d.StartWithBusybox("--userns-remap", "default"), checker.IsNil)
39 38
 
... ...
@@ -50,8 +50,7 @@ func getContainerStatus(c *check.C, containerID string) string {
50 50
 }
51 51
 
52 52
 func (s *DockerSuite) TestNetworkNat(c *check.C) {
53
-	testRequires(c, DaemonIsLinux)
54
-	testRequires(c, SameHostDaemon, NativeExecDriver)
53
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
55 54
 	msg := "it works"
56 55
 	startServerContainer(c, msg, 8080)
57 56
 	endpoint := getExternalAddress(c)
... ...
@@ -67,8 +66,7 @@ func (s *DockerSuite) TestNetworkNat(c *check.C) {
67 67
 }
68 68
 
69 69
 func (s *DockerSuite) TestNetworkLocalhostTCPNat(c *check.C) {
70
-	testRequires(c, DaemonIsLinux)
71
-	testRequires(c, SameHostDaemon, NativeExecDriver)
70
+	testRequires(c, DaemonIsLinux, SameHostDaemon)
72 71
 	var (
73 72
 		msg = "hi yall"
74 73
 	)
... ...
@@ -85,8 +83,7 @@ func (s *DockerSuite) TestNetworkLocalhostTCPNat(c *check.C) {
85 85
 }
86 86
 
87 87
 func (s *DockerSuite) TestNetworkLoopbackNat(c *check.C) {
88
-	testRequires(c, DaemonIsLinux)
89
-	testRequires(c, SameHostDaemon, NativeExecDriver, NotUserNamespace)
88
+	testRequires(c, DaemonIsLinux, SameHostDaemon, NotUserNamespace)
90 89
 	msg := "it works"
91 90
 	startServerContainer(c, msg, 8080)
92 91
 	endpoint := getExternalAddress(c)
... ...
@@ -259,7 +259,7 @@ func (s *DockerSuite) TestRunCreateVolumesInSymlinkDir(c *check.C) {
259 259
 	if daemonPlatform == "windows" {
260 260
 		testRequires(c, SameHostDaemon, WindowsDaemonSupportsVolumes)
261 261
 	} else {
262
-		testRequires(c, SameHostDaemon, NativeExecDriver)
262
+		testRequires(c, SameHostDaemon)
263 263
 	}
264 264
 
265 265
 	name := "test-volume-symlink"
... ...
@@ -923,7 +923,7 @@ func (s *DockerSuite) TestRunCapAddALLDropNetAdminCanDownInterface(c *check.C) {
923 923
 
924 924
 func (s *DockerSuite) TestRunGroupAdd(c *check.C) {
925 925
 	// Not applicable for Windows as there is no concept of --group-add
926
-	testRequires(c, DaemonIsLinux, NativeExecDriver)
926
+	testRequires(c, DaemonIsLinux)
927 927
 	out, _ := dockerCmd(c, "run", "--group-add=audio", "--group-add=staff", "--group-add=777", "busybox", "sh", "-c", "id")
928 928
 
929 929
 	groupsList := "uid=0(root) gid=0(root) groups=10(wheel),29(audio),50(staff),777"
... ...
@@ -1280,7 +1280,7 @@ func (s *DockerSuite) TestRunNonRootUserResolvName(c *check.C) {
1280 1280
 // uses the host's /etc/resolv.conf and does not have any dns options provided.
1281 1281
 func (s *DockerSuite) TestRunResolvconfUpdate(c *check.C) {
1282 1282
 	// Not applicable on Windows as testing unix specific functionality
1283
-	testRequires(c, SameHostDaemon, DaemonIsLinux, NativeExecDriver)
1283
+	testRequires(c, SameHostDaemon, DaemonIsLinux)
1284 1284
 
1285 1285
 	tmpResolvConf := []byte("search pommesfrites.fr\nnameserver 12.34.56.78\n")
1286 1286
 	tmpLocalhostResolvConf := []byte("nameserver 127.0.0.1")
... ...
@@ -2240,9 +2240,6 @@ func (s *DockerSuite) TestRunExposePort(c *check.C) {
2240 2240
 }
2241 2241
 
2242 2242
 func (s *DockerSuite) TestRunUnknownCommand(c *check.C) {
2243
-	if daemonPlatform != "windows" {
2244
-		testRequires(c, NativeExecDriver)
2245
-	}
2246 2243
 	out, _, _ := dockerCmdWithStdoutStderr(c, "create", "busybox", "/bin/nada")
2247 2244
 
2248 2245
 	cID := strings.TrimSpace(out)
... ...
@@ -2384,7 +2381,7 @@ func (s *DockerSuite) TestContainerNetworkMode(c *check.C) {
2384 2384
 
2385 2385
 func (s *DockerSuite) TestRunModePidHost(c *check.C) {
2386 2386
 	// Not applicable on Windows as uses Unix-specific capabilities
2387
-	testRequires(c, NativeExecDriver, SameHostDaemon, DaemonIsLinux, NotUserNamespace)
2387
+	testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace)
2388 2388
 
2389 2389
 	hostPid, err := os.Readlink("/proc/1/ns/pid")
2390 2390
 	if err != nil {
... ...
@@ -2406,7 +2403,7 @@ func (s *DockerSuite) TestRunModePidHost(c *check.C) {
2406 2406
 
2407 2407
 func (s *DockerSuite) TestRunModeUTSHost(c *check.C) {
2408 2408
 	// Not applicable on Windows as uses Unix-specific capabilities
2409
-	testRequires(c, NativeExecDriver, SameHostDaemon, DaemonIsLinux)
2409
+	testRequires(c, SameHostDaemon, DaemonIsLinux)
2410 2410
 
2411 2411
 	hostUTS, err := os.Readlink("/proc/1/ns/uts")
2412 2412
 	if err != nil {
... ...
@@ -2636,7 +2633,7 @@ func (s *DockerSuite) TestRunContainerWithWritableRootfs(c *check.C) {
2636 2636
 
2637 2637
 func (s *DockerSuite) TestRunContainerWithReadonlyRootfs(c *check.C) {
2638 2638
 	// Not applicable on Windows which does not support --read-only
2639
-	testRequires(c, NativeExecDriver, DaemonIsLinux)
2639
+	testRequires(c, DaemonIsLinux)
2640 2640
 
2641 2641
 	for _, f := range []string{"/file", "/etc/hosts", "/etc/resolv.conf", "/etc/hostname", "/sys/kernel", "/dev/.dont.touch.me"} {
2642 2642
 		testReadOnlyFile(f, c)
... ...
@@ -2647,7 +2644,7 @@ func (s *DockerSuite) TestPermissionsPtsReadonlyRootfs(c *check.C) {
2647 2647
 	// Not applicable on Windows due to use of Unix specific functionality, plus
2648 2648
 	// the use of --read-only which is not supported.
2649 2649
 	// --read-only + userns has remount issues
2650
-	testRequires(c, DaemonIsLinux, NativeExecDriver, NotUserNamespace)
2650
+	testRequires(c, DaemonIsLinux, NotUserNamespace)
2651 2651
 
2652 2652
 	// Ensure we have not broken writing /dev/pts
2653 2653
 	out, status := dockerCmd(c, "run", "--read-only", "--rm", "busybox", "mount")
... ...
@@ -2662,7 +2659,7 @@ func (s *DockerSuite) TestPermissionsPtsReadonlyRootfs(c *check.C) {
2662 2662
 
2663 2663
 func testReadOnlyFile(filename string, c *check.C) {
2664 2664
 	// Not applicable on Windows which does not support --read-only
2665
-	testRequires(c, NativeExecDriver, DaemonIsLinux, NotUserNamespace)
2665
+	testRequires(c, DaemonIsLinux, NotUserNamespace)
2666 2666
 
2667 2667
 	out, _, err := dockerCmdWithError("run", "--read-only", "--rm", "busybox", "touch", filename)
2668 2668
 	if err == nil {
... ...
@@ -2686,7 +2683,7 @@ func testReadOnlyFile(filename string, c *check.C) {
2686 2686
 func (s *DockerSuite) TestRunContainerWithReadonlyEtcHostsAndLinkedContainer(c *check.C) {
2687 2687
 	// Not applicable on Windows which does not support --link
2688 2688
 	// --read-only + userns has remount issues
2689
-	testRequires(c, NativeExecDriver, DaemonIsLinux, NotUserNamespace)
2689
+	testRequires(c, DaemonIsLinux, NotUserNamespace)
2690 2690
 
2691 2691
 	dockerCmd(c, "run", "-d", "--name", "test-etc-hosts-ro-linked", "busybox", "top")
2692 2692
 
... ...
@@ -2699,7 +2696,7 @@ func (s *DockerSuite) TestRunContainerWithReadonlyEtcHostsAndLinkedContainer(c *
2699 2699
 func (s *DockerSuite) TestRunContainerWithReadonlyRootfsWithDnsFlag(c *check.C) {
2700 2700
 	// Not applicable on Windows which does not support either --read-only or --dns.
2701 2701
 	// --read-only + userns has remount issues
2702
-	testRequires(c, NativeExecDriver, DaemonIsLinux, NotUserNamespace)
2702
+	testRequires(c, DaemonIsLinux, NotUserNamespace)
2703 2703
 
2704 2704
 	out, _ := dockerCmd(c, "run", "--read-only", "--dns", "1.1.1.1", "busybox", "/bin/cat", "/etc/resolv.conf")
2705 2705
 	if !strings.Contains(string(out), "1.1.1.1") {
... ...
@@ -2710,7 +2707,7 @@ func (s *DockerSuite) TestRunContainerWithReadonlyRootfsWithDnsFlag(c *check.C)
2710 2710
 func (s *DockerSuite) TestRunContainerWithReadonlyRootfsWithAddHostFlag(c *check.C) {
2711 2711
 	// Not applicable on Windows which does not support --read-only
2712 2712
 	// --read-only + userns has remount issues
2713
-	testRequires(c, NativeExecDriver, DaemonIsLinux, NotUserNamespace)
2713
+	testRequires(c, DaemonIsLinux, NotUserNamespace)
2714 2714
 
2715 2715
 	out, _ := dockerCmd(c, "run", "--read-only", "--add-host", "testreadonly:127.0.0.1", "busybox", "/bin/cat", "/etc/hosts")
2716 2716
 	if !strings.Contains(string(out), "testreadonly") {
... ...
@@ -2815,7 +2812,7 @@ func (s *DockerSuite) TestRunWriteToProcAsound(c *check.C) {
2815 2815
 
2816 2816
 func (s *DockerSuite) TestRunReadProcTimer(c *check.C) {
2817 2817
 	// Not applicable on Windows as uses Unix specific functionality
2818
-	testRequires(c, NativeExecDriver, DaemonIsLinux)
2818
+	testRequires(c, DaemonIsLinux)
2819 2819
 	out, code, err := dockerCmdWithError("run", "busybox", "cat", "/proc/timer_stats")
2820 2820
 	if code != 0 {
2821 2821
 		return
... ...
@@ -2830,7 +2827,7 @@ func (s *DockerSuite) TestRunReadProcTimer(c *check.C) {
2830 2830
 
2831 2831
 func (s *DockerSuite) TestRunReadProcLatency(c *check.C) {
2832 2832
 	// Not applicable on Windows as uses Unix specific functionality
2833
-	testRequires(c, NativeExecDriver, DaemonIsLinux)
2833
+	testRequires(c, DaemonIsLinux)
2834 2834
 	// some kernels don't have this configured so skip the test if this file is not found
2835 2835
 	// on the host running the tests.
2836 2836
 	if _, err := os.Stat("/proc/latency_stats"); err != nil {
... ...
@@ -2875,7 +2872,6 @@ func (s *DockerSuite) TestRunReadFilteredProc(c *check.C) {
2875 2875
 func (s *DockerSuite) TestMountIntoProc(c *check.C) {
2876 2876
 	// Not applicable on Windows as uses Unix specific functionality
2877 2877
 	testRequires(c, DaemonIsLinux)
2878
-	testRequires(c, NativeExecDriver)
2879 2878
 	_, code, err := dockerCmdWithError("run", "-v", "/proc//sys", "busybox", "true")
2880 2879
 	if err == nil || code == 0 {
2881 2880
 		c.Fatal("container should not be able to mount into /proc")
... ...
@@ -2885,7 +2881,7 @@ func (s *DockerSuite) TestMountIntoProc(c *check.C) {
2885 2885
 func (s *DockerSuite) TestMountIntoSys(c *check.C) {
2886 2886
 	// Not applicable on Windows as uses Unix specific functionality
2887 2887
 	testRequires(c, DaemonIsLinux)
2888
-	testRequires(c, NativeExecDriver, NotUserNamespace)
2888
+	testRequires(c, NotUserNamespace)
2889 2889
 	dockerCmd(c, "run", "-v", "/sys/fs/cgroup", "busybox", "true")
2890 2890
 }
2891 2891
 
... ...
@@ -2893,7 +2889,7 @@ func (s *DockerSuite) TestRunUnshareProc(c *check.C) {
2893 2893
 	c.Skip("unstable test: is apparmor in a container reliable?")
2894 2894
 
2895 2895
 	// Not applicable on Windows as uses Unix specific functionality
2896
-	testRequires(c, Apparmor, NativeExecDriver, DaemonIsLinux)
2896
+	testRequires(c, Apparmor, DaemonIsLinux)
2897 2897
 
2898 2898
 	name := "acidburn"
2899 2899
 	if out, _, err := dockerCmdWithError("run", "--name", name, "jess/unshare", "unshare", "-p", "-m", "-f", "-r", "--mount-proc=/proc", "mount"); err == nil || !strings.Contains(out, "Permission denied") {
... ...
@@ -2927,7 +2923,6 @@ func (s *DockerSuite) TestRunPublishPort(c *check.C) {
2927 2927
 func (s *DockerSuite) TestDevicePermissions(c *check.C) {
2928 2928
 	// Not applicable on Windows as uses Unix specific functionality
2929 2929
 	testRequires(c, DaemonIsLinux)
2930
-	testRequires(c, NativeExecDriver)
2931 2930
 	const permissions = "crw-rw-rw-"
2932 2931
 	out, status := dockerCmd(c, "run", "--device", "/dev/fuse:/dev/fuse:mrw", "busybox:latest", "ls", "-l", "/dev/fuse")
2933 2932
 	if status != 0 {
... ...
@@ -2941,7 +2936,6 @@ func (s *DockerSuite) TestDevicePermissions(c *check.C) {
2941 2941
 func (s *DockerSuite) TestRunCapAddCHOWN(c *check.C) {
2942 2942
 	// Not applicable on Windows as uses Unix specific functionality
2943 2943
 	testRequires(c, DaemonIsLinux)
2944
-	testRequires(c, NativeExecDriver)
2945 2944
 	out, _ := dockerCmd(c, "run", "--cap-drop=ALL", "--cap-add=CHOWN", "busybox", "sh", "-c", "adduser -D -H newuser && chown newuser /home && echo ok")
2946 2945
 
2947 2946
 	if actual := strings.Trim(out, "\r\n"); actual != "ok" {
... ...
@@ -2984,7 +2978,7 @@ func (s *DockerSuite) TestVolumeFromMixedRWOptions(c *check.C) {
2984 2984
 
2985 2985
 func (s *DockerSuite) TestRunWriteFilteredProc(c *check.C) {
2986 2986
 	// Not applicable on Windows as uses Unix specific functionality
2987
-	testRequires(c, Apparmor, NativeExecDriver, DaemonIsLinux, NotUserNamespace)
2987
+	testRequires(c, Apparmor, DaemonIsLinux, NotUserNamespace)
2988 2988
 
2989 2989
 	testWritePaths := []string{
2990 2990
 		/* modprobe and core_pattern should both be denied by generic
... ...
@@ -3253,7 +3247,7 @@ func (s *DockerSuite) TestPtraceContainerProcsFromHost(c *check.C) {
3253 3253
 
3254 3254
 func (s *DockerSuite) TestAppArmorDeniesPtrace(c *check.C) {
3255 3255
 	// Not applicable on Windows as uses Unix specific functionality
3256
-	testRequires(c, SameHostDaemon, NativeExecDriver, Apparmor, DaemonIsLinux, NotGCCGO)
3256
+	testRequires(c, SameHostDaemon, Apparmor, DaemonIsLinux, NotGCCGO)
3257 3257
 
3258 3258
 	// Run through 'sh' so we are NOT pid 1. Pid 1 may be able to trace
3259 3259
 	// itself, but pid>1 should not be able to trace pid1.
... ...
@@ -3277,7 +3271,7 @@ func (s *DockerSuite) TestAppArmorDeniesChmodProc(c *check.C) {
3277 3277
 	c.Skip("Test is failing, and what it tests is unclear")
3278 3278
 
3279 3279
 	// Not applicable on Windows as uses Unix specific functionality
3280
-	testRequires(c, SameHostDaemon, NativeExecDriver, Apparmor, DaemonIsLinux)
3280
+	testRequires(c, SameHostDaemon, Apparmor, DaemonIsLinux)
3281 3281
 	_, exitCode, _ := dockerCmdWithError("run", "busybox", "chmod", "744", "/proc/cpuinfo")
3282 3282
 	if exitCode == 0 {
3283 3283
 		// If our test failed, attempt to repair the host system...
... ...
@@ -3290,7 +3284,7 @@ func (s *DockerSuite) TestAppArmorDeniesChmodProc(c *check.C) {
3290 3290
 
3291 3291
 func (s *DockerSuite) TestRunCapAddSYSTIME(c *check.C) {
3292 3292
 	// Not applicable on Windows as uses Unix specific functionality
3293
-	testRequires(c, DaemonIsLinux, NativeExecDriver)
3293
+	testRequires(c, DaemonIsLinux)
3294 3294
 
3295 3295
 	dockerCmd(c, "run", "--cap-drop=ALL", "--cap-add=SYS_TIME", "busybox", "sh", "-c", "grep ^CapEff /proc/self/status | sed 's/^CapEff:\t//' | grep ^0000000002000000$")
3296 3296
 }
... ...
@@ -3327,7 +3321,7 @@ func (s *DockerSuite) TestRunNamedVolume(c *check.C) {
3327 3327
 
3328 3328
 func (s *DockerSuite) TestRunWithUlimits(c *check.C) {
3329 3329
 	// Not applicable on Windows as uses Unix specific functionality
3330
-	testRequires(c, DaemonIsLinux, NativeExecDriver)
3330
+	testRequires(c, DaemonIsLinux)
3331 3331
 
3332 3332
 	out, _ := dockerCmd(c, "run", "--name=testulimits", "--ulimit", "nofile=42", "busybox", "/bin/sh", "-c", "ulimit -n")
3333 3333
 	ul := strings.TrimSpace(out)
... ...
@@ -3338,7 +3332,7 @@ func (s *DockerSuite) TestRunWithUlimits(c *check.C) {
3338 3338
 
3339 3339
 func (s *DockerSuite) TestRunContainerWithCgroupParent(c *check.C) {
3340 3340
 	// Not applicable on Windows as uses Unix specific functionality
3341
-	testRequires(c, DaemonIsLinux, NativeExecDriver)
3341
+	testRequires(c, DaemonIsLinux)
3342 3342
 
3343 3343
 	cgroupParent := "test"
3344 3344
 	name := "cgroup-test"
... ...
@@ -3368,7 +3362,7 @@ func (s *DockerSuite) TestRunContainerWithCgroupParent(c *check.C) {
3368 3368
 
3369 3369
 func (s *DockerSuite) TestRunContainerWithCgroupParentAbsPath(c *check.C) {
3370 3370
 	// Not applicable on Windows as uses Unix specific functionality
3371
-	testRequires(c, DaemonIsLinux, NativeExecDriver)
3371
+	testRequires(c, DaemonIsLinux)
3372 3372
 
3373 3373
 	cgroupParent := "/cgroup-parent/test"
3374 3374
 	name := "cgroup-test"
... ...
@@ -3398,7 +3392,7 @@ func (s *DockerSuite) TestRunContainerWithCgroupParentAbsPath(c *check.C) {
3398 3398
 func (s *DockerSuite) TestRunContainerWithCgroupMountRO(c *check.C) {
3399 3399
 	// Not applicable on Windows as uses Unix specific functionality
3400 3400
 	// --read-only + userns has remount issues
3401
-	testRequires(c, DaemonIsLinux, NativeExecDriver, NotUserNamespace)
3401
+	testRequires(c, DaemonIsLinux, NotUserNamespace)
3402 3402
 
3403 3403
 	filename := "/sys/fs/cgroup/devices/test123"
3404 3404
 	out, _, err := dockerCmdWithError("run", "busybox", "touch", filename)
... ...
@@ -3553,7 +3547,7 @@ func (s *DockerSuite) TestContainersInUserDefinedNetwork(c *check.C) {
3553 3553
 }
3554 3554
 
3555 3555
 func (s *DockerSuite) TestContainersInMultipleNetworks(c *check.C) {
3556
-	testRequires(c, DaemonIsLinux, NotUserNamespace, NativeExecDriver)
3556
+	testRequires(c, DaemonIsLinux, NotUserNamespace)
3557 3557
 	// Create 2 networks using bridge driver
3558 3558
 	dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork1")
3559 3559
 	dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork2")
... ...
@@ -3572,7 +3566,7 @@ func (s *DockerSuite) TestContainersInMultipleNetworks(c *check.C) {
3572 3572
 }
3573 3573
 
3574 3574
 func (s *DockerSuite) TestContainersNetworkIsolation(c *check.C) {
3575
-	testRequires(c, DaemonIsLinux, NotUserNamespace, NativeExecDriver)
3575
+	testRequires(c, DaemonIsLinux, NotUserNamespace)
3576 3576
 	// Create 2 networks using bridge driver
3577 3577
 	dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork1")
3578 3578
 	dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork2")
... ...
@@ -3617,7 +3611,7 @@ func (s *DockerSuite) TestNetworkRmWithActiveContainers(c *check.C) {
3617 3617
 }
3618 3618
 
3619 3619
 func (s *DockerSuite) TestContainerRestartInMultipleNetworks(c *check.C) {
3620
-	testRequires(c, DaemonIsLinux, NotUserNamespace, NativeExecDriver)
3620
+	testRequires(c, DaemonIsLinux, NotUserNamespace)
3621 3621
 	// Create 2 networks using bridge driver
3622 3622
 	dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork1")
3623 3623
 	dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork2")
... ...
@@ -92,7 +92,7 @@ func (s *DockerSuite) TestRunWithVolumesIsRecursive(c *check.C) {
92 92
 }
93 93
 
94 94
 func (s *DockerSuite) TestRunDeviceDirectory(c *check.C) {
95
-	testRequires(c, NativeExecDriver, NotUserNamespace)
95
+	testRequires(c, DaemonIsLinux, NotUserNamespace)
96 96
 	if _, err := os.Stat("/dev/snd"); err != nil {
97 97
 		c.Skip("Host does not have /dev/snd")
98 98
 	}
... ...
@@ -314,7 +314,7 @@ func (s *DockerSuite) TestRunEchoStdoutWithMemoryLimit(c *check.C) {
314 314
 // 16M memory and as much swap memory as they need (if the host
315 315
 // supports swap memory).
316 316
 func (s *DockerSuite) TestRunWithoutMemoryswapLimit(c *check.C) {
317
-	testRequires(c, NativeExecDriver)
317
+	testRequires(c, DaemonIsLinux)
318 318
 	testRequires(c, memoryLimitSupport)
319 319
 	testRequires(c, swapMemorySupport)
320 320
 	dockerCmd(c, "run", "-m", "16m", "--memory-swap", "-1", "busybox", "true")
... ...
@@ -420,7 +420,7 @@ func (s *DockerSuite) TestRunInvalidCpusetMemsFlagValue(c *check.C) {
420 420
 }
421 421
 
422 422
 func (s *DockerSuite) TestRunInvalidCPUShares(c *check.C) {
423
-	testRequires(c, cpuShare, NativeExecDriver)
423
+	testRequires(c, cpuShare, DaemonIsLinux)
424 424
 	out, _, err := dockerCmdWithError("run", "--cpu-shares", "1", "busybox", "echo", "test")
425 425
 	c.Assert(err, check.NotNil, check.Commentf(out))
426 426
 	expected := "The minimum allowed cpu-shares is 2"
... ...
@@ -229,9 +229,6 @@ func (d *Daemon) Start(arg ...string) error {
229 229
 	if d.storageDriver != "" {
230 230
 		args = append(args, "--storage-driver", d.storageDriver)
231 231
 	}
232
-	if d.execDriver != "" {
233
-		args = append(args, "--exec-driver", d.execDriver)
234
-	}
235 232
 
236 233
 	args = append(args, arg...)
237 234
 	d.cmd = exec.Command(dockerBinary, args...)
... ...
@@ -1,10 +1,8 @@
1 1
 package main
2 2
 
3 3
 import (
4
-	"encoding/json"
5 4
 	"fmt"
6 5
 	"io/ioutil"
7
-	"log"
8 6
 	"net/http"
9 7
 	"os"
10 8
 	"os/exec"
... ...
@@ -23,8 +21,6 @@ type testRequirement struct {
23 23
 
24 24
 // List test requirements
25 25
 var (
26
-	daemonExecDriver string
27
-
28 26
 	DaemonIsWindows = testRequirement{
29 27
 		func() bool { return daemonPlatform == "windows" },
30 28
 		"Test requires a Windows daemon",
... ...
@@ -105,30 +101,6 @@ var (
105 105
 		},
106 106
 		fmt.Sprintf("Test requires an environment that can host %s in the same host", notaryBinary),
107 107
 	}
108
-	NativeExecDriver = testRequirement{
109
-		func() bool {
110
-			if daemonExecDriver == "" {
111
-				// get daemon info
112
-				status, body, err := sockRequest("GET", "/info", nil)
113
-				if err != nil || status != http.StatusOK {
114
-					log.Fatalf("sockRequest failed for /info: %v", err)
115
-				}
116
-
117
-				type infoJSON struct {
118
-					ExecutionDriver string
119
-				}
120
-				var info infoJSON
121
-				if err = json.Unmarshal(body, &info); err != nil {
122
-					log.Fatalf("unable to unmarshal body: %v", err)
123
-				}
124
-
125
-				daemonExecDriver = info.ExecutionDriver
126
-			}
127
-
128
-			return strings.HasPrefix(daemonExecDriver, "native")
129
-		},
130
-		"Test requires the native (libcontainer) exec driver.",
131
-	}
132 108
 	NotOverlay = testRequirement{
133 109
 		func() bool {
134 110
 			cmd := exec.Command("grep", "^overlay / overlay", "/proc/mounts")
... ...
@@ -20,7 +20,6 @@ docker-daemon - Enable daemon mode
20 20
 [**--dns**[=*[]*]]
21 21
 [**--dns-opt**[=*[]*]]
22 22
 [**--dns-search**[=*[]*]]
23
-[**-e**|**--exec-driver**[=*native*]]
24 23
 [**--exec-opt**[=*[]*]]
25 24
 [**--exec-root**[=*/var/run/docker*]]
26 25
 [**--fixed-cidr**[=*FIXED-CIDR*]]
... ...
@@ -112,9 +111,6 @@ format.
112 112
 **--dns-search**=[]
113 113
   DNS search domains to use.
114 114
 
115
-**-e**, **--exec-driver**=""
116
-  Force Docker to use specific exec driver. Default is `native`.
117
-
118 115
 **--exec-opt**=[]
119 116
   Set exec driver options. See EXEC DRIVER OPTIONS.
120 117
 
... ...
@@ -225,8 +225,8 @@ inside it)
225 225
 
226 226
 # EXEC DRIVER OPTIONS
227 227
 
228
-Use the **--exec-opt** flags to specify options to the exec-driver. The only
229
-driver that accepts this flag is the *native* (libcontainer) driver. As a
228
+Use the **--exec-opt** flags to specify options to the execution driver. The only
229
+runtime that accepts any options is Linux. As a
230 230
 result, you must also specify **-s=**native for this option to have effect. The 
231 231
 following is the only *native* option:
232 232