对应用程序进行 docker 化后无法访问烧瓶端点
Unable to access flask endpoints after dockerizing the app
我正在开发一个 flask 应用程序,它有一个已注册的 url 列表。我能够在本地 运行 烧瓶应用程序并访问为其注册的 url。
但是当我 docker 化该应用程序并使用 docker-compose
将其 运行 化时,我无法访问该应用程序的 url。
当 运行 在本地安装该应用程序时,如果我访问该应用程序的 app.url_map
,我能够看到该应用程序的所有已注册网址的列表。 (我创建了一个端点 - /urls
当点击 returns url_map
列表时)
但是当我尝试访问相同的端点时 - /urls
在 运行 中 docker 应用程序之后,除了 [=17] 我没有看到任何列表=] 基本上就是它自己的端点。
我哪里错了?
这是 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>])"
}
wsgi.py
文件中的代码似乎有些问题。从 wsgi.py
文件中删除应用程序创建代码并粘贴到 app
文件夹中的 __init__.py
文件中,并从那里导入函数。
现在一切正常。
我正在开发一个 flask 应用程序,它有一个已注册的 url 列表。我能够在本地 运行 烧瓶应用程序并访问为其注册的 url。
但是当我 docker 化该应用程序并使用 docker-compose
将其 运行 化时,我无法访问该应用程序的 url。
当 运行 在本地安装该应用程序时,如果我访问该应用程序的 app.url_map
,我能够看到该应用程序的所有已注册网址的列表。 (我创建了一个端点 - /urls
当点击 returns url_map
列表时)
但是当我尝试访问相同的端点时 - /urls
在 运行 中 docker 应用程序之后,除了 [=17] 我没有看到任何列表=] 基本上就是它自己的端点。
我哪里错了?
这是 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>])"
}
wsgi.py
文件中的代码似乎有些问题。从 wsgi.py
文件中删除应用程序创建代码并粘贴到 app
文件夹中的 __init__.py
文件中,并从那里导入函数。
现在一切正常。