使用multiprocessing.manangers.BaseManager作为docker组合编排的一部分



我过去曾多次使用docker-compose,并成功地利用了作为docker-compose编排的一部分创建的内部网络。

我有一个非常简单的例子,其中我有两个服务:

version: '3'
services:
intent:
restart: always
build: ./dockerfs/intent
command: gunicorn -w 2 --bind 0.0.0.0:5000 --timeout 999 --log-level debug client:app
ports: 
- 8075:5000
base_s:
restart: always
build: ./dockerfs/base

其中服务CCD_ 1是通过连接到BaseManager服务器的base_;持有";connections:中的全局数据

import json
import uuid
from multiprocessing import Lock
from multiprocessing.managers import BaseManager

connections = {}
lock = Lock()

def get_connection(intent_id):
with lock:
if intent_id not in connections:
print(f"{intent_id} not in connections. creating now...")
connections[intent_id] = object()
print(f"addining intent_id {intent_id} to connections")
return connections[intent_id]

print("starting BaseManager!")
manager = BaseManager(("localhost", 8098), b"password")
manager.register("get_connection", get_connection)
server = manager.get_server()
server.serve_forever()

服务意图是一个烧瓶应用程序;得到";来自BaseManager服务的数据:

import uuid
from multiprocessing.managers import BaseManager
from flask import g, session, Flask, jsonify

app = Flask(__name__)

client_id = uuid.uuid4().hex

def get_client():
# if not hasattr(g, "rserve"):
# calling http:<service> as I normally would to "interact" with service in shared network
manager = BaseManager(("http://base_s", 8098), b"password")  # <<
manager.register("get_connection")
manager.connect()
o = manager.get_connection(client_id)
print(f"got object using id {o}")
return f"got it {o}"

@app.route("/", methods=["GET", "POST"])
def client():
o = get_client()
return jsonify({"client_id": client_id, "object_id": o}

我可以在本地主机上成功地运行上面的代码,但当我使用上面共享的docker-compose文件启动这些服务时,我会得到一个intent_1 | socket.gaierror: [Errno -2] Name or service not known

我的印象是,我可以与BaseManager服务交互,因为docker compose维护着一个内部网络,这让我觉得我可能不了解BaseManager是如何服务的。

有人能想到为什么我无法连接到BaseManager服务吗?

提前谢谢。

更新:

作为base_s服务中netstat -a命令的一部分,我看到

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 ip-127-0-0-11.ec2:37121 0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:8098            0.0.0.0:*               LISTEN     
udp        0      0 ip-127-0-0-11.ec2:53041 0.0.0.0:*   

所以看起来一切都在听。

工作正常。

我做了两个改变:

base_s服务代码中

  1. manager = BaseManager(("localhost", 8098), b"password")manager = BaseManager(("", 8098), b"password")

这会选择一个默认地址,以确保您没有监听环回地址

客户端烧瓶api代码2(base_s0至

我认为真正的修复是2——我认为BaseManager不需要HTTP连接。

相关内容

  • 没有找到相关文章

最新更新