代码之家  ›  专栏  ›  技术社区  ›  The Fool

如何在docker容器中设置烧瓶socketio?

  •  0
  • The Fool  · 技术社区  · 6 年前

    它似乎在运行,但当我试图访问端口5000上的本地主机时(从浏览器中)出现了一个错误,就像我习惯于使用flask应用程序一样。上面写着:无法连接!

    我将向您展示5个重要文件:Dockerfile、requirements.txt、docker-compose.yml、web_app.py和index.html

    文档文件:

    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 --build docker-compose run web /bin/bash 以交互模式进入此容器。

    网络应用程序.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)
    

    <!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或其他东西。

    如果有人给我一点提示,我会很高兴的。 干杯

    2 回复  |  直到 6 年前
        1
  •  3
  •   The Fool    6 年前

    更新2 run 命令:

     docker-compose run --service-ports web
    

    我发现我们可以在docker-compose.yaml中定义本地主机,而不必在python文件中将其作为参数传递。 - --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: __init__.py
    
        ports:
          - '5000:5000'
    
        entrypoint:
          - flask
          - run
          - --host=0.0.0.0
    

    旧的---:

    结果发现,解决方案(我还不知道它有多有用)是这里建议的东西的组合。

    因此,首先我需要在python文件中将host设置为参数,如下所示:

    if __name__ == '__main__':
    socketio.run(app, host='0.0.0.0')
    

    docker-compose run web /bin/bash 然后 python web_app.py

        entrypoint:
        - python
        - web_app.py
    

    当这两件事结合在一起时,我实际上可以在端口5000看到我的页面 docker-compose up . web服务被连接并运行应用程序。现在我只需要看看这有多有用,因为我把代码目录作为卷挂载,所以不必一直重建映像。我还不确定这是否能如愿。

    谢谢大家帮我。

    编辑:为了得到我想要的行为,我可以使用flask环境变量。 我在docker-compose.yml中为我的web服务设置了如下:

      environment:
        FLASK_DEBUG: 1
        FLASK_ENV: development
    

    P、 下面是完整的docker-compose.yml,以便更清楚地说明:

    version: "3"
    
    services:
    
      web:
        build: ./web
        environment:
          FLASK_DEBUG: 1
          FLASK_ENV: development
        ports:
          - '5000:5000'
        volumes:
          - './web:/code'
        entrypoint:
          - python
          - web_app.py
    
        2
  •  0
  •   Fine    6 年前

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

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