From e76537d57c87e493e79f5fdf5337d553498a911c Mon Sep 17 00:00:00 2001 From: Yong Tang Date: Mon, 5 Dec 2016 08:56:42 -0800 Subject: [PATCH] Fix issue for `--hostname` when running in "--net=host" This fix tries to address the issue raised in 29129 where "--hostname" not working when running in "--net=host" for `docker run`. The fix fixes the issue by not resetting the `container.Config.Hostname` if the `Hostname` has already been assigned through `--hostname`. An integration test has been added to cover the changes. This fix fixes 29129. Signed-off-by: Yong Tang Upstream-commit: b0a7b0120f4461daa34527a743087e73ef8f5963 Component: engine --- components/engine/daemon/container.go | 14 ++++++++++++-- components/engine/daemon/container_operations.go | 8 +++++--- components/engine/daemon/create.go | 2 +- .../engine/integration-cli/docker_cli_run_test.go | 9 +++++++++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/components/engine/daemon/container.go b/components/engine/daemon/container.go index dd4a5d6c16..2a44800098 100644 --- a/components/engine/daemon/container.go +++ b/components/engine/daemon/container.go @@ -2,6 +2,7 @@ package daemon import ( "fmt" + "os" "path/filepath" "time" @@ -101,7 +102,7 @@ func (daemon *Daemon) Register(c *container.Container) error { return nil } -func (daemon *Daemon) newContainer(name string, config *containertypes.Config, imgID image.ID, managed bool) (*container.Container, error) { +func (daemon *Daemon) newContainer(name string, config *containertypes.Config, hostConfig *containertypes.HostConfig, imgID image.ID, managed bool) (*container.Container, error) { var ( id string err error @@ -112,7 +113,16 @@ func (daemon *Daemon) newContainer(name string, config *containertypes.Config, i return nil, err } - daemon.generateHostname(id, config) + if hostConfig.NetworkMode.IsHost() { + if config.Hostname == "" { + config.Hostname, err = os.Hostname() + if err != nil { + return nil, err + } + } + } else { + daemon.generateHostname(id, config) + } entrypoint, args := daemon.getEntrypointAndArgs(config.Entrypoint, config.Cmd) base := daemon.newBaseContainer(id) diff --git a/components/engine/daemon/container_operations.go b/components/engine/daemon/container_operations.go index 5224308b7c..c30250622d 100644 --- a/components/engine/daemon/container_operations.go +++ b/components/engine/daemon/container_operations.go @@ -851,9 +851,11 @@ func (daemon *Daemon) initializeNetworking(container *container.Container) error } if container.HostConfig.NetworkMode.IsHost() { - container.Config.Hostname, err = os.Hostname() - if err != nil { - return err + if container.Config.Hostname == "" { + container.Config.Hostname, err = os.Hostname() + if err != nil { + return err + } } } diff --git a/components/engine/daemon/create.go b/components/engine/daemon/create.go index a4205aacc8..7bfe9f120c 100644 --- a/components/engine/daemon/create.go +++ b/components/engine/daemon/create.go @@ -96,7 +96,7 @@ func (daemon *Daemon) create(params types.ContainerCreateConfig, managed bool) ( return nil, err } - if container, err = daemon.newContainer(params.Name, params.Config, imgID, managed); err != nil { + if container, err = daemon.newContainer(params.Name, params.Config, params.HostConfig, imgID, managed); err != nil { return nil, err } defer func() { diff --git a/components/engine/integration-cli/docker_cli_run_test.go b/components/engine/integration-cli/docker_cli_run_test.go index 0b53fc9967..2e06f61241 100644 --- a/components/engine/integration-cli/docker_cli_run_test.go +++ b/components/engine/integration-cli/docker_cli_run_test.go @@ -4660,3 +4660,12 @@ func (s *DockerSuite) TestRunMountReadOnlyDevShm(c *check.C) { c.Assert(err, checker.NotNil, check.Commentf(out)) c.Assert(out, checker.Contains, "Read-only file system") } + +// Test case for 29129 +func (s *DockerSuite) TestRunHostnameInHostMode(c *check.C) { + testRequires(c, DaemonIsLinux) + + expectedOutput := "foobar\nfoobar" + out, _ := dockerCmd(c, "run", "--net=host", "--hostname=foobar", "busybox", "sh", "-c", `echo $HOSTNAME && hostname`) + c.Assert(strings.TrimSpace(out), checker.Equals, expectedOutput) +}