web-dev-qa-db-fra.com

Docker-compose: définir un nom d'hôte égal à son nom d'hôte du conteneur

À l'heure actuelle, j'ai deux nœuds dans le cluster Swarm

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
yey1njv9uz8adf33m7oz0h80f *   redis2              Ready               Active              Leader
lbo91v2l15h24isfd5jegoxu1     redis3              Ready               Active   

c'est le fichier docker-compose.yml

version: "3"
services:
  daggr:
    # replace username/repo:tag with your name and image details
    image: daggr
    hostname: examplehostname
    deploy:
      replicas: 1
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
        - "8080:8080"
    volumes:
        - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
        placement:
            constraints: [node.role == manager]
    networks:
        - webnet
  redis:
    image: redis
    networks:
        - webnet
networks:
  webnet:

comme vous le voyez, je configure explicitement hostname pour le service daggr

le conteneur daggr exécute essentiellement un serveur Web python tornado

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('Hello from daggr running on %s\n' % socket.gethostname())

J'ai testé comme ci-dessous

$ curl redis2:4000
Hello from daggr running on examplehostname

Maintenant, au lieu de définir de manière statique le nom d’hôte, je veux que ce soit une correspondance dynamique avec le nom d’hôte de l’emplacement du conteneur. c'est à dire. si le conteneur daggr est exécuté sur redis2, il devrait indiquer redis2 et sur redis3, il devrait indiquer redis3.

Comment puis-je spécifier cela à partir du fichier docker-compose.yml?

4
ealeon

Si vous utilisez au moins Docker 17.10, vous pouvez utiliser quelque chose comme ceci:

services:
  daggr:
    hostname: '{{.Node.Hostname}}'

Voir this pour plus d'informations.

4

La réponse sélectionnée ci-dessus n'a pas fonctionné pour moi (probablement parce que je ne lance pas docker/docker-compose en mode essaim). 

J'ai pu configurer le nom d'hôte du conteneur pour mon proxy inverse afin qu'il corresponde au nom de domaine complet de l'hôte docker en procédant comme suit: 

version: '3'

reverse-proxy:
  hostname: $HOSTNAME

Cela m'a permis de configurer facilement Nginx pour qu'il sélectionne la paire cert/serveur de serveur correcte avant le démarrage.

1
brandonsimpkins