我有一个使用bokeh的Flask应用程序,该应用程序在Docker容器中运行,并且在本地计算机上使用时可以运行。
但是,当我将其部署到GCP实例时,即使可以访问服务器,也有一些AjaxDataSource()对象无法连接。
一些细节,
烧瓶应用程序是这样启动的,
app.run(host="0.0.0.0", port=6600, debug=False)
Ajax路由如下,
http://127.0.0.1:6600/land/tmidemo/data_rate?name=ResultBaseKeysV1
GCP防火墙规则如下,
Name Type Targets Filters Protocols / ports Action Priority Network
tmiserver-egress Egress Apply to all IP ranges: 0.0.0.0/0 tcp:6600 udp:6600 Allow 1000 default
tmiserver-ingress Ingress Apply to all IP ranges: 0.0.0.0/0 tcp:6600 udp:6600 Allow 1000 default
docker容器是这样运行的,
docker run --net tminet --hostname=TEST -p 6600:6600 -v $(pwd):/app/public --name myserver --rm myserver
我没有使用Bokeh服务器。 AjaxDataSource()调用指向烧瓶应用程序,而不是其他(散景)服务器
有很多可行的方法,
什么是不的工作方式是使用127.0.0.1
的Ajax()调用,尽管当我在本地计算机上运行容器时,这确实可行。
我在检查窗口中看到的错误是 ERR_CONNECTION_REFUSED
GCP实例hosts.conf
做包含一行127.0.0.1 localhost
我在here上尝试过GCP VM实例,结果相同,
iptables -A INPUT -i docker0 -j ACCEPT
我还尝试(从here起)将Docker运行网络更改为--net="host"
,结果是相同的。
我还尝试将--add-host localhost:127.0.0.1
添加到Docker run命令中,结果相同。
我认为问题在于将GCP配置为知道如何将请求路由到127.0.0.1
,但是我不知道该在哪里检查,配置它,这超出了我已经完成的工作。
答案 0 :(得分:0)
我无法具体解决自己遇到的问题,但是我尝试使用另一种方法来处理AjaxDataSource()
的URL,并且该方法有效,我认为是一种更好的方法...
我使用了Flask url_for()
函数来创建指向AjaxDataSource()
所需的路由的链接,并且该链接有效。生成的链接看起来像
/land/tmidemo/data_rate/ResultBaseKeysV1
即没有http://127.0.0.1
,这似乎在我的开发环境和GCP的所有情况下都有效。
我想我很久以前就尝试过,但是没有用,因为我到处都使用了“ flask” URL,但是由于某种原因,我认为我需要“ http://127.0.0.1”作为Ajax的东西。它的作品现在...继续前进!