【问题标题】:Unable to access flask endpoints after dockerizing the appdockerizing 应用程序后无法访问烧瓶端点
【发布时间】:2020-02-05 19:25:19
【问题描述】:

我正在开发一个已注册 url 列表的烧瓶应用程序。我能够在本地运行烧瓶应用程序并访问为其注册的网址。

但是当我将应用程序 dockerize 并使用 docker-compose 运行它时,我无法访问该应用程序的 URL。

在本地运行应用程序时,如果我访问应用程序的app.url_map,我能够看到该应用程序的所有注册网址列表。 (我创建了一个端点 - /urls,当点击返回 url_map 列表)

但是当我在 docker 中运行应用程序后尝试访问同一个端点 - /urls 时,除了 /urls 端点(基本上就是它本身)之外,我看不到任何列表。

我哪里出错了?

这是 wsgi.py 文件:

import os
from flask import Flask, jsonify
from app.workload.views import register_workload_urls

def load_urls(app):
    app_mode = os.getenv("APP_MODE")
    if app_mode == "WORKLOAD":
        register_workload_urls(app)

application = Flask(__name__)

@application.route('/urls')
def urls():
    return jsonify({"APP": str(os.getenv("APP_MODE")), "URLs registered": f"{str(application.url_map)}"})

if __name__ == "__main__":
    load_urls(application)
    application.run()

views.py:

def register_workload_urls(application):
    @application.route('/api/workload/health/check/')
    def w_check():
        return jsonify({'status': f"Workload service is {app.config_pub.status}."})

    @application.route('/api/workload/health/up/')
    def w_up():
        app.config_pub.status = "UP"
        app.config_pub.dispatch("UP")
        return jsonify({'status': f"Workload service is {app.config_pub.status}."})

    @application.route('/api/workload/health/down/')
    def w_down():
        app.config_pub.status = "DOWN"
        app.config_pub.dispatch("DOWN")
        return jsonify({'status': f"Workload service is {app.config_pub.status}."})

docker-compose.yml:

  workload_service:
    container_name: workload_container
    restart: always
    image: workload
    build: 
      context: ./dsdp
      dockerfile: Dockerfile.app.local
    ports:
      - "5000:5000"
    environment:
        - PYTHONPATH=.
        - FLASK_APP=wsgi.py
        - FLASK_DEBUG=1
        - CONFIG_PATH=config/local
        - APP_MODE=WORKLOAD
    command: flask run --host=0.0.0.0 --port 5000

Dockerfile.app.local:

FROM python:3.7
RUN mkdir -p /var/www/dsdp/
WORKDIR /var/www/dsdp/
COPY . /var/www/dsdp/
RUN pip3 install --no-cache-dir -r requirements.txt
EXPOSE 5000

在 docker 中运行时/urls 的输出:

{
  "APP": "WORKLOAD",
  "URLs registered": "Map([<Rule '/urls' (GET, HEAD, OPTIONS) -> urls>,\n <Rule '/static/<filename>' (GET, HEAD, OPTIONS) -> static>])"
}

【问题讨论】:

  • 如果您浏览到 /urls,输出是什么。你能访问烧瓶网络服务器吗?您在日志中看到什么了吗?
  • /urls 的输出是已注册的 url 列表。我能够到达烧瓶服务器。在日志中,当我点击/urls 以外的任何端点时,我看到的只是 404 错误。使用/urls 输出更新问题。
  • 好的,只是为了测试一些东西,您可以尝试将视图中的函数直接放在 init.py 中并删除而不是 register_workload_urls

标签: python docker flask docker-compose flask-restful


【解决方案1】:

wsgi.py 文件中包含代码似乎有些问题。从wsgi.py 文件中删除应用程序创建代码并粘贴到app 文件夹中的__init__.py 文件中并从那里导入函数。

现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2018-03-21
    • 2021-07-11
    • 2021-09-21
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多