Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set hostname in global service in Docker Swarm

I have a service deployed to my Docker Swarm Cluster as global service (ELK Metricbeat).

I want to each of this service to have a hostname the same as the hostname of the running node (host)?

in another word, how I can achieve the same result in the yml file such as:

 docker run -h `hostname` elastic/metricbeat:5.4.1

this is my yml file:

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

I have tried:

  hostname: '`hostname`'
  hostname: '${hostname}'

but no success.

Any solution?

Thank you in advance.

like image 397
sadok-f Avatar asked Jun 06 '17 08:06

sadok-f


2 Answers

For anyone coming here :

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

No need to alter entry point ( at least on swarm on deploy )

like image 111
Grégory Boddin Avatar answered Oct 23 '22 10:10

Grégory Boddin


I resolved the issue by mounting the host hostname file under /etc/nodehostname and changing the service container to use an entrypoint that read the file and replace a variable (name) in metricbeat.yml

docker-entrypoint.sh

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

envsubst '$NODE_HOSTNAME' </etc/metricbeat/metricbeat.yml.tpl > /etc/metricbeat/metricbeat.yml
like image 27
sadok-f Avatar answered Oct 23 '22 09:10

sadok-f