diff --git a/daemon/container.go b/daemon/container.go index dd4a5d6c16..2a44800098 100644 --- a/daemon/container.go +++ b/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/daemon/container_operations.go b/daemon/container_operations.go index 5224308b7c..c30250622d 100644 --- a/daemon/container_operations.go +++ b/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/daemon/create.go b/daemon/create.go index a4205aacc8..7bfe9f120c 100644 --- a/daemon/create.go +++ b/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/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go index 0b53fc9967..2e06f61241 100644 --- a/integration-cli/docker_cli_run_test.go +++ b/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) +}