python - 如何在 docker 容器中设置 flask-socketio?
问题描述
您好,我正在尝试在 docker 容器中设置 flask-socketio。它似乎可以运行,但是当我尝试访问端口 5000 上的 localhost 时出现错误(来自浏览器),就像我习惯使用烧瓶应用程序一样。它说:无法连接!
我将向您展示 5 个重要文件:Dockerfile、requirements.txt、docker-compose.yml、web_app.py 和 index.html
Dockerfile:
FROM python:3.6.5
WORKDIR /code
COPY * /code/
RUN pip install -r requirements.txt
要求.txt:
Flask==1.0.2
Flask-SocketIO==3.0.1
eventlet==0.24.1
码头工人-compose.yml:
version: "3"
services:
web:
build: ./web
ports:
- '5000:5000'
volumes:
- './web:/code'
我使用命令 docker-compose up --build
并docker-compose run web /bin/bash
以交互模式进入这个容器。
web_app.py:
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('my event')
def log_message(message):
emit('my response', {'data': 'got it!'})
if __name__ == '__main__':
socketio.run(app)
索引.html:
<!doctype html>
<html>
<head>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
<title>SocketIO</title>
</head>
<body>
<script type="text/javascript" charset="utf-8">
//Establish connection and emit a message to confirm.
var socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('connect', function() {
socket.emit('my event', {data: 'I\'m connected!'});
});
</script>
</body>
</html>
一旦进入容器,我就简单地运行:python web_app.py
但没有任何反应。没有错误,也没有工作页面。
我觉得我错过了正确初始化所有内容的步骤,但我无法找出它是什么。网络上到处都是非常不同的例子,我很困惑。更难的是我在这里使用了 eventlet,但并不是每个例子都走这条路。有些使用 gevent 或其他东西。
如果有人给我一点提示,我会很高兴。干杯
解决方案
开始撰写时,请确保为烧瓶设置了所有环境变量。还提供--host=0.0.0.0
在您的入口点或命令中侦听所有网络接口的选项。
更新的 docker-compose 文件:
version: "3"
services:
web:
build: ./web
volumes:
- './application:/application'
environment:
FLASK_DEBUG: 1
FLASK_ENV: development
FLASK_APP: web_app.py
ports:
- '5000:5000'
entrypoint:
- flask
- run
- --host=0.0.0.0
当您想以交互模式运行容器以用于开发目的时,您可以使用docker-compose 运行以下命令来运行它。--service-ports
需要公开 compose 文件中指定的容器端口。如果未提供此标志,则不会有外部流量到达应用程序。那是我原来的问题。
docker-compose run --service-ports web bash
或者,您可以手动发布端口
docker-compose run --publish 5000:5000 web bash
推荐阅读
- r - 如何创建包含嵌套 xts 对象的列 - 雅虎数据?
- javascript - 如何通过在 JavaScript 和 VueJS 中使用字符串变量作为其名称来调用导入的模块
- go - 将数组复制到地图会导致地图中的相同项目
- html - 动画 HTML 初始屏幕在移动设备上更改大小
- rest - SPA - 基于服务器端验证的操作确认
- javascript - 向数组添加的对象变得未定义
- c - C中的模量是否有反转
- django - 有没有办法在 Django 中将分页添加到 html 页面?
- javascript - 如何在div中的选定文本下添加div?
- python - Python读取具有不同行数的csv文件