在同一 docker 网络内的请愿书中查看 docker 服务名称

问题描述 投票:0回答:1

所以我有多个服务在同一个 docker 网络中与 Flask 一起运行 它们是这样设置的:

version: '3'
services:
  login:
    build:
      context: ./repo_login
      dockerfile: Development.Dockerfile
    volumes:
      - ./repo_login:/home/app
    ports:
      - "5007:5001"
    restart: unless-stopped
    environment:
      ENV: 'development'
    networks:
      - qa_network
  jobs:
    build:
      context: ./repo_jobs
      dockerfile: Development.Dockerfile
    volumes:
      - ./repo_jobs:/home/app
    ports:
      - "5017:5001"
    restart: unless-stopped
    environment:
      PYTHONUNBUFFERED: 1
      ENV: 'development'
    networks:
      - qa_network
  sla:
    build:
      context: ./repo_sla
      dockerfile: Development.Dockerfile
    volumes:
      - ./repo_sla:/home/app
    ports:
      - "5008:5001"
    restart: unless-stopped
    environment:
      ENV: 'development'
    networks:
      - qa_network

我知道我可以仅使用服务名称从一个服务向另一个服务提出请求,如下所示:

requests.post('http://jobs:5001/some/api', data=json.dumps(data), headers=headers)
但有没有办法知道请愿书来自哪个服务?

我已经尝试使用request.environ,但我只得到一个IP和端口,我不知道它的服务。我使用了下一个代码

@app.route('/some/api', methods=['POST'])
def execute_task():
    try:
        origin = request.environ['REMOTE_ADDR']
        origin_port = request.environ['REMOTE_PORT']
        logging.warning(f'the origin of the petition is: {origin} : {origin_port}')
   except Exception as ex:
        data = None
        message = getattr(ex, 'message', str(ex))
        logging.exception(ex)
docker flask docker-compose dockerfile
1个回答
0
投票

您可以使用更高级的工具(例如服务发现系统)来完成这项工作。但如果您不想使用这些工具,有一个简单的解决方案。 您可以在

requester
应用程序中添加标头,例如:

import requests
headers = {'service': 'foo'}
requests.post('http://jobs:5001/some/api', data=json.dumps(data), headers=headers)

然后在您的

receiver
应用程序中,您可以检查标题:

from flask import request
serviceName = request.headers.get('service')

然后您将获得可以使用的服务名称。

© www.soinside.com 2019 - 2024. All rights reserved.