debugging 如何使用pipenv和docker在调试模式下运行Flask应用程序?

iyzzxitl  于 2022-11-14  发布在  Docker
关注(0)|答案(1)|浏览(126)

我将app.py设置为调试模式:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('home.html', title='Title Here')

# ...
# more routes here
# ...

if __name__ == '__main__':
    app.run(debug=True)

Python库geopandas把我的本地机器弄得一团糟,这就是为什么我决定把我的应用程序停靠起来,它工作得很好!(除了 flask 调试模式)
我的Dockerfile看起来像这样。我尝试了debugpy库,但没有成功:

FROM python:3.9-slim as base

# Setup env
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONFAULTHANDLER 1

FROM base AS python-deps

# Install pipenv and compilation dependencies
RUN pip install pipenv
RUN apt-get update && apt-get install -y --no-install-recommends gcc

# Install python dependencies in /.venv
COPY Pipfile .
COPY Pipfile.lock .
RUN PIPENV_VENV_IN_PROJECT=1 pipenv install geopandas
RUN PIPENV_VENV_IN_PROJECT=1 pipenv install debugpy
RUN PIPENV_VENV_IN_PROJECT=1 pipenv install --deploy
CMD pipenv debugpy

FROM base AS runtime

# Copy virtual env from python-deps stage
COPY --from=python-deps /.venv /.venv
ENV PATH="/.venv/bin:$PATH"

WORKDIR /home

# Install application into container
COPY . .

然后我用这个来构建图像:
docker build -t <IMAGE-NAME:HERE> .
然后我用这个脚本初始化docker容器:
docker run --rm -ti --mount type=bind,source=/"$(pwd)",target=/home -p 5000:5000 <IMAGE-NAME:HERE> flask run --port 5000 --host 0.0.0.0 --debugger
除调试模式外,其他一切都正常:

* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://172.17.0.2:5000

有什么想法吗?

xj3cbfub

xj3cbfub1#

首先,回答你的问题:

flask --debug run --port 5000 --host 0.0.0.0

调试模式使能--debugger--reload
我在开发Flask应用程序时使用Docker作为运行时取得了巨大的成功。它使开发变得相当容易,尤其是当你的应用程序增长一点,需要其他服务(如数据库或Redis示例)时,与Docker组合在一起时。
我有点搞不懂为什么CMD在运行时阶段之前,为什么要使用pipenv debugpy而不是pipenv run debugpy。(也就是说,我没有调试经验,所以也许这实际上是正确的。)无论如何,我鼓励您使用investigate ENTRYPOINT,看看它是否可以简化调用。
顺便说一句,你应该考虑创建一个docker-compose.yml文件,然后用docker compose up启动你的服务。上面的docker CLI咒语已经开始变得笨拙了。这还没有经过测试,但是应该可以让你开始使用:

version: "3.9"

services:
  web:
    image: <IMAGE_NAME>
   
    # Fix slow shutdown of web container
    # See: https://stackoverflow.com/a/62854251/1749551
    init: true
    
    environment:
      FLASK_ENV: development # Implies --debug
      PORT: 5000
    ports:
      - 5000:5000
    restart: always
    entrypoint: "flask run --host=0.0.0.0"

    # To enable pdb within Docker:
    # https://hackernoon.com/debugging-using-pdb-in-dockerized-environment-i21n2863
    stdin_open: true
    tty: true

    # Bind the project directory into the container so changes are reflected by Flask
    volumes:
      - .:/home

最后,要意识到什么。

相关问题