【问题标题】:Try to reach docker container from python script (Interactive brokers)尝试从 python 脚本(交互式代理)访问 docker 容器
【发布时间】:2021-12-23 17:48:11
【问题描述】:

在我的 Synology 上,我正在运行这个 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”。对我来说没有意义。

这可能是什么问题?

【问题讨论】:

  • 你在哪里运行代码?你到底得到了什么错误,包括回溯?
  • 我在我的工作站上运行 Visual Studio 代码中的代码。当我调试时,我收到以下消息:“发生异常:gaierror [Errno 11001] getaddrinfo failed File "Y:\broker\demo.py", line 6, in ib.connect('192.168.2.6:32776' , 4002, 客户 ID=1)"

标签: python docker synology interactive-brokers


【解决方案1】:

根据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)

【讨论】:

  • 好的,谢谢。我从一个教程(没有 Docker)中得到了我的代码。我显然是错误的实施。太好了!
【解决方案2】:

首先,只是为了测试,直接尝试使用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 添加映射。

【讨论】:

  • 谢谢,我试过了: ib.connect('192.168.2.6:32776', 4001, clientId=1) 以各种方式添加了端口4002的映射,也没有运气。如何检查 IB socat 服务是否正在运行?
  • @hacking_mike 像任何服务一样,service socat status(如root
  • 当我在容器的进程中检查它时,它的执行没有错误。
  • 映射到 4002 也不起作用。
  • @hacking_mike 你可以用docker exec -it <yourContainer> bash执行命令
猜你喜欢
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多