Связь между Flask и контейнерами Bokeh, созданными с помощью docker -compose, завершается неудачно с ERR_NAME_NOT_RESOLVED - PullRequest
0 голосов
/ 25 февраля 2020

В настоящее время я вхожу в 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 таким образом, или мне нужно изменить его полностью?

1 Ответ

0 голосов
/ 25 февраля 2020

Эта строка

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

использует bokehapp в качестве имени хоста, но вы не настроили docker сеть или DNS-сервер для преобразования этого имени хоста в IP-адрес.

Docker -compose делает это автоматически, но вам нужно, чтобы имя хоста совпадало с именем docker -compose. Из документов Docker -Compose:

По умолчанию Compose устанавливает единую сеть для вашего приложения. Каждый контейнер для службы присоединяется к сети по умолчанию и доступен другим контейнерам в этой сети и может быть обнаружен ими с именем хоста, идентичным имени контейнера.

Этот должен сработает, если вы измените либо URL-адрес, соответствующий имени службы, либо имя службы, соответствующее URL-адресу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...