如何在没有env vars

时间:2015-04-22 21:10:47

标签: docker

除了使用环境变量之外,还有什么方法可以从该主机上运行的容器内获取docker主机的主机名? 我知道我可以在容器创建时将主机名作为环境变量传递给容器。我想知道如何在运行时查找它。

foo.example.com (docker host)
  bar (docker container)

在docker host bar中运行容器foo.example.com是否有办法获取“foo.example.com”?

编辑以添加用例:

容器将为表单

的服务发现创建SRV记录
_service._proto.name. TTL class SRV priority weight port target.
-----------------------------------------------------------------
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo.example.com.

其中20003是docker主机上动态分配的端口,用于监听bar中某个固定端口的服务(docker处理从主机端口到容器端口的映射)。

我的容器将运行运行状况检查以确保它已成功创建该SRV记录,因为其他docker主机上还有许多其他bar容器也会创建自己的SRV记录。

_service._proto.name. TTL class SRV priority weight port target.
-----------------------------------------------------------------
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo.example.com. <--
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo2.example.com.
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo3.example.com.

运行状况检查将遍历SRV记录,查找上面的第一个记录,因此需要知道其主机名。

预留

我正在使用Helios并且发现它添加了env var for me,我可以从中获取主机名。但我很好奇,以防我使用没有Helios的码头工具。

8 个答案:

答案 0 :(得分:22)

您可以轻松地将其作为环境变量传递

docker run .. -e HOST_HOSTNAME=`hostname` ..

使用

-e HOST_HOSTNAME=`hostname`

将调用主机名并将其作为名为HOST_HOSTNAME的环境变量使用,当然您可以根据需要自定义密钥。

请注意,这适用于bash shell,如果您使用不同的shell,则可能需要查看&#34; backtick&#34;的替代方法,例如fish shell替代方案

docker run .. -e HOST_HOSTNAME=(hostname) ..

答案 1 :(得分:14)

您可以将主机名作为环境变量传递。你也可以挂载/ etc,这样你就可以使用/ etc / hostname。但我同意Vitaly,这不是IMO容器的预期用例。

答案 2 :(得分:10)

我正在添加这个,因为在任何其他答案中都没有提到。您可以使用-h指令在运行时为容器指定特定的主机名。

docker run -h=my.docker.container.example.com ubuntu:latest

您可以使用反引号(或shell使用的任何等效项)将hosthame的输出转换为-h参数。

docker run -h=`hostname` ubuntu:latest

有一点需要注意,hostname的值将从您运行命令的主机中获取,因此如果您想要运行docker容器的虚拟机的主机名,那么使用hostname作为参数可能不正确您正在使用主机在虚拟机上执行docker命令。

答案 3 :(得分:5)

另一个对我有用的选择是将主机的网络命名空间绑定到docker。

添加:

docker run --net host

答案 4 :(得分:5)

我认为我遇到同样问题的原因是bug in the latest Docker for Mac beta,但是在那里的评论中,我能找到一个对我有用的解决方案。我的团队。我们正在将其用于本地开发,在我们努力取代它时,我们需要我们的集装箱化服务与巨石交谈。这可能不是一种生产可行的解决方案。

在主机上,将已知的可用IP地址别名为loopback接口:

$ sudo ifconfig lo0 alias 10.200.10.1/24

然后将具有主机名的IP添加到docker配置中。就我而言,我使用的是docker-compose,所以我把它添加到了我的docker-compose.yml:

extra_hosts:
# configure your host to alias 10.200.10.1 to the loopback interface:
#       sudo ifconfig lo0 alias 10.200.10.1/24
- "relevant_hostname:10.200.10.1"

然后,我通过附加到bash会话并使用wget从主机的Web服务器请求页面来验证所需的主机服务(Web服务器)是否可从容器内部获得:

$ docker exec -it container_name /bin/bash
$ wget relevant_hostname/index.html
$ cat index.html

答案 5 :(得分:0)

您可以像这样将其作为环境变量传递。通常Node是运行它的主机。主机名在创建时默认为节点的主机名。

docker service create -e 'FOO={{.Node.Hostname}}' nginx  

然后您可以执行docker ps来获取进程ID并查看环境

$ docker exec -it c81640b6d1f1 env                                                                                                                                    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=c81640b6d1f1
TERM=xterm
FOO=docker-desktop
NGINX_VERSION=1.17.4
NJS_VERSION=0.3.5
PKG_RELEASE=1~buster
HOME=/root

使用metricbeats的例子是一个例子,因此您知道哪个节点出现了系统问题,我将其放在https://github.com/trajano/elk-swarm中:

  metricbeat:
    image: docker.elastic.co/beats/metricbeat:7.4.0
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro
      - /proc:/hostfs/proc:ro
      - /:/hostfs:ro
    user: root
    hostname: "{{.Node.Hostname}}"
    command:
      - -E
      - |
        metricbeat.modules=[
          {
            module:docker,
            hosts:[unix:///var/run/docker.sock],
            period:10s,
            enabled:true
          }
        ] 
      - -E
      - processors={1:{add_docker_metadata:{host:unix:///var/run/docker.sock}}} 
      - -E
      - output.elasticsearch.enabled=false
      - -E
      - output.logstash.enabled=true
      - -E
      - output.logstash.hosts=["logstash:5044"]
    deploy:
      mode: global

答案 6 :(得分:0)

我跑了

docker info | grep Name: | xargs | cut -d' ' -f2

在我的容器内。

答案 7 :(得分:-1)

我知道这是一个古老的问题,但是我也需要此解决方案,并且我也加入了另一个解决方案。

我使用 entrypoint.sh 执行以下行,并为该实例定义具有实际主机名的变量:

HOST=`hostname --fqdn`

然后,我在入口点脚本中使用了它:

echo "Value: $HOST"

希望这会有所帮助