我目前正在进入Bokeh,并进行了一些尝试,使用Docker在网络中提供Bokeh服务器,到目前为止,效果很好。最初,我使用Bokeh的FileInput小部件将csv文件作为数据源上传到Bokeh服务器,但是如果您要上传多个文件,这将变得非常麻烦。因此,我报废了Bokeh的FileInput,并尝试使用Flask构建html模板,在该模板中我可以一次选择并上传多个文件。在对JavaScript进行了一些摆弄以将文件传输到Bokeh服务器之后,我终于也开始运行它了。然后,我再次尝试将整个容器化,并设法通过在容器中手动运行Bokeh和Flask并在Flask文件中硬编码Bokeh服务器的IP来做到这一点。
这远非最佳选择,因为IP可能会更改,或者如果我构建其他的Bokeh应用程序,则必须再次手动设置所有内容。因此,我尝试使用docker-compose来替我解决这个问题,这就是我遇到的主要障碍。我绝对不能让Flask容器与Bokeh容器通信。它们都正在运行,我可以分别访问它们,但是Bokeh服务器不会嵌入在Flask的html中,并且我总是在控制台中获得net::ERR_NAME_NOT_RESOLVED
。
我有两个想法,问题的根源可能是什么,但现在我不知道如何解决这两个问题。
1。我试图以错误的方式调用Bokeh容器
或
2。使用docker-compose
时无法以这种方式嵌入Bokeh服务器这里是代码的基本部分:
散景服务器以bokeh serve bkapp.py --allow-websocket-origin=*
运行。
docker-compose.yaml看起来像这样:
version: '3'
services:
flaskapp:
container_name: composed-flask
build:
context: .
dockerfile: flaskapp.Dockerfile
volumes:
- './:/app'
ports:
- '14100:8000'
bokehapp:
container_name: composed-bokeh
build:
context: .
dockerfile: bokehapp.Dockerfile
ports:
- '5006:5006'
volumes:
- './:/app'
各个端口也在相应的dockerfile中也为EXPOSE
d。
在烧瓶文件中,使用Bokeh的server_document
生成了一段JavaScript代码,然后将其插入html模板中。
from flask import Flask, render_template
from bokeh.embed import server_document
app = Flask(__name__)
# Index page, no args
@app.route('/')
def bkapp_page():
script = server_document('http://bokehapp:5006/bkapp')
return render_template("fileupload.html", script=script, template="Flask")
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True, use_reloader=False)
我也尝试使用容器名称composed-bokeh
和0.0.0.0
代替服务名称,但没有成功。
是否可以通过这种方式将容器化的Bokeh服务器嵌入Flask,还是必须完全更改它?
此行
script = server_document('http://bokehapp:5006/bkapp')
使用bokehapp
作为主机名,但是您尚未设置Docker网络或DNS服务器来将该主机名解析为IP地址。
Docker-compose自动执行此操作,但是您需要主机名以匹配容器名称。从Docker-Compose文档:
默认情况下,Compose为您的应用设置一个网络。服务的每个容器都加入默认网络,并且都可以被该网络上的其他容器访问,并且可以在与容器名称相同的主机名下被它们发现。