繁体   English   中英

尝试从 python 脚本(交互式代理)访问 docker 容器

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

在我的群晖中,我有这个 docker 容器正在运行: https://registry.hub.docker.com/r/mgvazquez/ibgateway/

在“手册”中说:“在此示例中,您将以纸质模式启动盈透证券网关,侦听端口 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 是网关内部的套接字端口设置。

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

这里可能是什么问题?

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

连接使用以下语法:

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) -- 如果建立连接的时间超过 timeout 秒,则引发 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)

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

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

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

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

Dockerfile 注册它
尝试为端口 4002 添加映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM