[英]Setting up bokeh server on AWS ElasticBeanstalk
I'm an AWS beginner interested in setting up a very simple scientific web app. 我是一名AWS初学者,有兴趣建立一个非常简单的科学网络应用程序。 I've identified bokeh server as a good platform for this. 我已经将散景服务器识别为一个很好的平台。 In terms of actual coding, my code won't be too different from the "Sliders" demo , source code here . 在实际编码方面,我的代码与“Sliders”演示 , 源代码在这里不会有太大的不同。 I can successfully run sliders.py
locally. 我可以在本地成功运行sliders.py
。
I've also provisioned a demo AWS Elastic Beanstalk application. 我还配置了一个演示AWS Elastic Beanstalk应用程序。 I used "64bit Debian jessie v2.7.3 running Python 3.4 (Preconfigured - Docker). I've successfully uploaded and deployed docker-python-v1.zip
from the Elastic Beanstalk samples . 我使用了64位运行Python 3.4的64位Debian jessie v2.7.3(预配置 - Docker)。我已成功上传并部署了Elastic Beanstalk样本中的 docker-python-v1.zip
。
Where I'm stuck is combining the two - running Bokeh server on Elastic Beanstalk. 我陷入困境的是将两个运行的Bokeh服务器组合在Elastic Beanstalk上。 I'm unfortunately in over my head reading the AWS and bokeh-server docs, and I couldn't find other resources online for combining the two. 不幸的是,我正在阅读AWS和散景服务器文档,我无法在线找到其他资源来合并这两者。 How do you launch a bokeh-server app from Elastic Beanstalk? 如何从Elastic Beanstalk启动散景服务器应用程序? Specifically, how do you build a .zip
package that's ready to upload on the default Elastic Beanstalk Python Docker? 具体来说, 如何构建一个 准备在默认的Elastic Beanstalk Python Docker上传 的 .zip
包?
I was able to get it working after a good deal of trial and error. 经过大量的试验和错误后,我才能让它工作。 I created a git repo with everything you need to get started but it is certainly not enough for production: 我创建了一个git repo,其中包含您开始所需的一切,但对于生产来说肯定是不够的:
https://github.com/denson/bokeh_beanstalk_helloworld https://github.com/denson/bokeh_beanstalk_helloworld
Docker file: Docker文件:
# docker build -t standalone_embed .
# docker image ls
# docker run -p 80:5006 standalone_embed
# List all containers (only IDs) docker ps -aq.
# Stop all running containers. docker stop $(docker ps -aq)
# Remove all containers. docker rm $(docker ps -aq)
# Remove all images. docker rmi $(docker images -q)
FROM continuumio/miniconda3
# Set the ENTRYPOINT to use bash
# (this is also where you’d set SHELL,
# if your version of docker supports this)
ENTRYPOINT [ “/bin/bash”, “-c” ]
EXPOSE 5006
COPY . /
WORKDIR /
# Conda supports delegating to pip to install dependencies
# that aren’t available in anaconda or need to be compiled
# for other reasons. In our case, we need psycopg compiled
# with SSL support. These commands install prereqs necessary
# to build psycopg.
RUN apt-get update && apt-get install -y \
libpq-dev \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# Install pyviz
# http://pyviz.org/installation.html
# update conda and install pyviz
RUN conda update conda
RUN conda update conda
# RUN conda install -c pyviz/label/dev pyviz
# install flask and Bokeh
RUN conda install -c conda-forge bokeh
RUN conda install -c anaconda flask
RUN conda install -c anaconda pandas
# We set ENTRYPOINT, so while we still use exec mode, we don’t
# explicitly call /bin/bash
ENTRYPOINT ["python", "./standalone_embed.py"]
# https://github.com/lukauskas/docker-bokeh
# https://github.com/bokeh/bokeh/issues/7724
standalone_embed.py standalone_embed.py
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, Slider
from bokeh.plotting import figure
from bokeh.server.server import Server
from bokeh.themes import Theme
from bokeh.sampledata.sea_surface_temperature import sea_surface_temperature
def modify_doc(doc):
df = sea_surface_temperature.copy()
source = ColumnDataSource(data=df)
plot = figure(x_axis_type='datetime', y_range=(0, 25), y_axis_label='Temperature (Celsius)',
title="Sea Surface Temperature at 43.18, -70.43")
plot.line('time', 'temperature', source=source)
def callback(attr, old, new):
if new == 0:
data = df
else:
data = df.rolling('{0}D'.format(new)).mean()
source.data = ColumnDataSource(data=data).data
slider = Slider(start=0, end=30, value=0, step=1, title="Smoothing by N Days")
slider.on_change('value', callback)
doc.add_root(column(slider, plot))
doc.theme = Theme(filename="theme.yaml")
# Setting num_procs here means we can't touch the IOLoop before now, we must
# let Server handle that. If you need to explicitly handle IOLoops then you
# will need to use the lower level BaseServer class.
# To allow connections only from a trusted domain set allow_websocket_origin to the domain
# server = Server({'/': modify_doc}, num_procs=1, address="0.0.0.0", port=5006, allow_websocket_origin=["flaskhelloworld-env.gktytvudba.us-east-2.elasticbeanstalk.com"])
# to allow connections from anywhere
server = Server({'/': modify_doc}, num_procs=1, address="0.0.0.0", port=5006, allow_websocket_origin=["*"])
server.start()
if __name__ == '__main__':
print('Opening Bokeh application on http://0.0.0.0:5006/')
server.io_loop.add_callback(server.show, "/")
server.io_loop.start()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.