【问题标题】:Docker v1.12 can not change hostname by env variable $HOSTNAMEDocker v1.12 无法通过环境变量 $HOSTNAME 更改主机名
【发布时间】:2016-11-07 13:39:45
【问题描述】:

在以前的 docker 版本中,“hostname”和“echo $HOSTNAME”的命令返回相同的内容,在我通过将 env 变量发送到图像中进行更改后。

我使用它的原因是 我想通过调用主机名或 $HOSTNAME 将新主机插入 /etc/hosts。因此,我在这个 docker 中的服务/应用程序可以获得“真实”IP 地址或我分配的 IP 地址,而不是 docker 内部的。

在以前的 docker 版本中,我可以通过分配环境变量 HOSTNAME 来更改主机名,这将相应地更改主机名。但现在,使用 docker 版本 1.12。这种 linux 操作在那种 linux 行为中不起作用。

所以如果这样写:

version: '2'

services:
  test:
    build: .
    extra_hosts:
        thisservice: "192.168.1.7"
    environment:
      - HOSTNAME=thisservice
    image: dockerv1.12-test

Dockerfile:

FROM alpine
CMD sleep 120

通过docker-compose exec test sh进入docker容器,然后cat /etc/hosts看起来像这样:

127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.1.7 thisservice
172.28.0.2  80260fa6667f

同时:

$ hostname
80260fa6667f

$ echo $HOSTNAME
thisservice

这是我上面提到的错误行为,以前的 docker 版本不会发生这种情况。

在这种情况下,容器中的服务将不知道我分配的 IP,而是选择 docker 内部 IP。这不是我想要的。在我看来,这不是正确的行为。

我在 Ubuntu 16.04 和 Centos 7.2 上都试过;在我升级 docker v1.10 之前,两个发行版都按预期工作。在将 docker 升级到 v1.12.1 和 v1.12.3 后,两者都出现了“错误”。

那么这是 docker v1.12 中的集群模式的错误还是故意的?

如何根据需要更改主机名?

【问题讨论】:

    标签: docker hostname


    【解决方案1】:

    docker-compose.yml

    version: '2'
    services:
      test:
        build: .
        hostname: thisservice
        image: dockerv1.12-tes
    

    【讨论】:

    • 是的,这行得通。但仍然与 docker 1.10 版不同。这是我的错,我没有正确描述这个问题。我将更新上面的主要问题。
    • 您的示例在我的 docker 1.12.3 和 docker-compose 1.7.0 中按预期工作。您可以直接在 extra_hosts 中使用主机名,而不是设置 HOSTNAME 环境变量:-“thisservice:192.168.1.7”
    • 我试过 docker v1.12.3 + docker-compose 1.8.1。仍然和我上面描述的一样。我猜是主机名的命令与“echo $HOSTNAME”的命令不同。我的服务必须使用主机名和我需要在 zookeeper 集群上注册服务的 IP。所以我必须使用环境变量 HOSTNAME。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2018-02-17
    • 1970-01-01
    相关资源
    最近更新 更多