Docker-compose:设置主机名等于容器运行所在的主机名

eal*_*eon 6 docker docker-compose docker-swarm

现在,我在群集集群中有两个节点

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
yey1njv9uz8adf33m7oz0h80f *   redis2              Ready               Active              Leader
lbo91v2l15h24isfd5jegoxu1     redis3              Ready               Active   
Run Code Online (Sandbox Code Playgroud)

这是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:
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在明确设置daggr服务的主机名

daggr容器基本上运行python龙卷风Web服务器

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

我已经测试了如下

$ curl redis2:4000
Hello from daggr running on examplehostname
Run Code Online (Sandbox Code Playgroud)

现在,我希望它不是静态设置主机名,而是要动态匹配容器运行所在的主机名。即。如果daggr容器在redis2上运行,则应该说redis2,在redis3上应该说redis3。

如何从docker-compose.yml文件中指定?

Con*_*enu 6

如果您至少运行Docker,17.10则可以使用以下代码:

services:
  daggr:
    hostname: '{{.Node.Hostname}}'
Run Code Online (Sandbox Code Playgroud)

请参阅以获取更多信息。

  • 我使用的是 Docker 19.03.5,这个语法在 docker-compose 中根本不起作用,它只是被解释为去掉大括号的字符串文字。难道我做错了什么? (6认同)