尝试从 python 脚本访问 docker 容器(Interactive brokers)

Try to reach docker container from python script (Interactive brokers)

在我的 synology 上我有这个 docker 容器 运行ning: https://registry.hub.docker.com/r/mgvazquez/ibgateway/

“手册”中说:“在此示例中,您将以纸张模式启动 Interactive Brokers Gateway,监听端口 4001,VNC 服务器监听端口 5900”

所以在 docker 容器中我做了以下端口映射:

本地端口32778到容器5900,本地端口32776到容器4001。我的Synology Nas是192.168.2.6。

当我使用 vnc 从本地电脑连接到 192.168.2.6:32778 时,它运行良好。

现在,在我的 Python 脚本中我这样做:

from ib_insync import *
ib = IB()

# use this instead for IB Gateway
ib.connect('192.168.2.6:32776', 4002, clientId=1)

4002是网关内部设置的socket端口。

当我 运行 脚本时,我得到“Getaddrinfo failed”。对我来说没有意义。

这可能是什么问题?

首先,只是为了测试,尝试直接使用端口 4001:

ib.connect('192.168.2.6:32776', 4002, clientId=1)

其次,检查您的IB socat service is running,因为它是建立两个双向字节流并在 4001 和 4002 之间传输数据的服务:

echo "Starting Interactive Brokers Controller" | info
exec socat TCP-LISTEN:4001,fork TCP:127.0.0.1:4002 2>&1 | info

Dockerfile registers it.
尝试为端口 4002 添加映射。

根据 API 文档 https://ib-insync.readthedocs.io/api.html#module-ib_insync.ib

连接使用以下语法:

connect(host='127.0.0.1', port=7497, clientId=1, timeout=4, readonly=False, account='')

host (str) – 主机名或 IP 地址。

port (int) – 端口号。

clientId (int) – 用于此客户端的 ID 号;每个连接必须是唯一的。设置 clientId=0 将自动合并手动 TWS 交易与该客户端。

timeout (float) – 如果建立连接花费的时间超过超时秒数,则会引发 asyncio.TimeoutError 异常。设置为 0 以禁用超时。

readonly (bool) – 当 API 处于只读模式时设置为 True。

account (str) – 接收更新的主账户。

所以你的代码:

# use this instead for IB Gateway
ib.connect('192.168.2.6:32776', 4002, clientId=1)

应改为:

# use this instead for IB Gateway
ib.connect('192.168.2.6', 32776, clientId=1)