繁体   English   中英

如何在docker容器中设置flask-socketio?

[英]How to setup flask-socketio in a docker container?

您好,我正在尝试在 docker 容器中设置flask-socketio。 它似乎可以运行,但是当我尝试访问端口 5000 上的 localhost 时出现错误(来自浏览器),就像我习惯使用 Flask 应用程序一样。 它说:无法连接!

我将向您展示 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

docker-compose.yml:

version: "3"
services:
  web:
    build: ./web
    ports:
      - '5000:5000'
    volumes:
      - './web:/code'

我使用命令docker-compose up --builddocker-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需要公开组合文件中指定的容器端口。 如果未提供此标志,则不会有外部流量到达应用程序。 那是我原来的问题。

docker-compose run --service-ports web bash

或者,您可以手动发布端口

docker-compose run --publish 5000:5000 web bash

您尚未在 docker 容器中启动应用程序。 在 Dockerfile 中再添加两行:

EXPOSE 5000

ENTRYPOINT ["python", "/code/web_app.py"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM