В настоящее время я вхожу в Bokeh и немного поэкспериментировал с тем, чтобы сделать сервер Bokeh доступным в сети с использованием Docker, что до сих пор получалось довольно неплохо. Первоначально я использовал виджет BoIn FileInput для загрузки CSV-файлов на сервер Bokeh в качестве источника данных, но это становится довольно громоздким, если вы хотите загрузить более нескольких файлов. Поэтому я удалил FileInput из Bokeh и попытался создать шаблон html с Flask, где я могу выбрать и загрузить несколько файлов одновременно. Немного поиграв с JavaScript для передачи файлов на сервер Bokeh, я, наконец, тоже запустил его. Затем я снова попытался заключить в контейнер все, и мне удалось это сделать, запустив Bokeh и Flask в контейнерах вручную и жестко запрограммировав IP-адрес сервера Bokeh в файле Flask.
Это далеко не оптимально, поскольку IP-адреса могут измениться, или если я создам другое приложение Bokeh, мне придется заново все настроить вручную. Поэтому я попытался использовать docker -compose, чтобы позаботиться об этом для меня, и вот где я врезался в большую стену. Я абсолютно не могу заставить контейнер Flask связаться с контейнером Bokeh. Они оба работают, и я могу получить к ним доступ отдельно, но сервер Bokeh не будет встроен в Flask html, и я всегда получаю net::ERR_NAME_NOT_RESOLVED
в консоли.
У меня есть две идеи, какова может быть причина проблемы, но сейчас я не знаю, как решить любую из них.
1. Я пытаюсь неправильно назвать контейнер Bokeh
или
2. Сервер Bokeh не может быть встроен таким образом при использовании 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'
Соответствующие порты также EXPOSE
d в соответствующем файле Docker.
В flask file кусок JavaScript Код генерируется с помощью server_document
Bokeh, который затем вставляется в шаблон 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 таким образом, или мне нужно изменить его полностью?