使用docker-compose创建的Flask和Bokeh容器之间的通信失败,并显示ERR_NAME_NOT_RESOLVED

问题描述 投票:0回答:1

我目前正在进入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-bokeh0.0.0.0代替服务名称,但没有成功。

是否可以通过这种方式将容器化的Bokeh服务器嵌入Flask,还是必须完全更改它?

python docker flask docker-compose bokeh
1个回答
0
投票

此行

script = server_document('http://bokehapp:5006/bkapp')

使用bokehapp作为主机名,但是您尚未设置Docker网络或DNS服务器来将该主机名解析为IP地址。

Docker-compose自动执行此操作,但是您需要主机名以匹配容器名称。从Docker-Compose文档:

默认情况下,Compose为您的应用设置一个网络。服务的每个容器都加入默认网络,并且都可以被该网络上的其他容器访问,并且可以在与容器名称相同的主机名下被它们发现。

© www.soinside.com 2019 - 2024. All rights reserved.