如何在Docker Swarm的全局服务中设置主机名

如何在Docker Swarm的全局服务中设置主机名,docker,elastic-stack,docker-swarm,metricbeat,Docker,Elastic Stack,Docker Swarm,Metricbeat,我在Docker Swarm集群中部署了一个服务作为全球服务(ELK Metricbeat) 我希望此服务的每个主机名都与正在运行的节点(主机)的主机名相同 换句话说,我如何在yml文件中实现相同的结果,例如: docker run -h `hostname` elastic/metricbeat:5.4.1 这是我的yml文件: metricbeat: image: elastic/metricbeat:5.4.1 command: metricbeat -e -c /etc/me

我在Docker Swarm集群中部署了一个服务作为全球服务(ELK Metricbeat)

我希望此服务的每个主机名都与正在运行的节点(主机)的主机名相同

换句话说,我如何在yml文件中实现相同的结果,例如:

 docker run -h `hostname` elastic/metricbeat:5.4.1
这是我的yml文件:

metricbeat:
  image: elastic/metricbeat:5.4.1
  command: metricbeat -e -c /etc/metricbeat/metricbeat.yml -system.hostfs=/hostfs
  hostname: '`hostname`'
  volumes:
    - /proc:/hostfs/proc:ro
    - /sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro
    - /:/hostfs:ro
    - /var/run/docker.sock:/var/run/docker.sock
  networks:
    - net
  user: root
  deploy:
    mode: global
我试过:

  hostname: '`hostname`'
  hostname: '${hostname}'
但是没有成功

有解决办法吗


提前感谢。

我通过在
/etc/nodehostname
下装载主机名文件并将服务容器更改为使用入口点读取文件并替换metricbeat.yml中的变量(名称),解决了此问题

docker-entrypoint.sh

export NODE_HOSTNAME=$(eval cat /etc/nodehostname)

envsubst '$NODE_HOSTNAME' </etc/metricbeat/metricbeat.yml.tpl > /etc/metricbeat/metricbeat.yml
export NODE_HOSTNAME=$(eval cat/etc/nodehostname)
envsubt'$NODE_HOSTNAME'/etc/metricbeat/metricbeat.yml

对于任何来到这里的人:

services:
  myservice:
    hostname: "{{.Node.Hostname}}-{{.Service.Name}}"

无需更改入口点(至少在swarm on deploy上)

此提案获得批准后,将解决许多问题,包括我的问题: