【问题标题】:How to run a Flask app in debug mode with using pipenv and docker?如何使用 pipenv 和 docker 在调试模式下运行 Flask 应用程序?
【发布时间】:2022-10-13 12:53:24
【问题描述】:

我将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) 

名为 geopandas 的 Python 库正在搞乱我的本地机器,这就是为什么我决定对我的应用程序进行 docker 化,它运行良好! (烧瓶调试模式除外)

我的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

有任何想法吗?

【问题讨论】:

  • Docker 旨在将容器环境与您的主机系统隔离开来;它不一定适合日常开发或调试环境。您的 Dockerfile 似乎没有安装除 C 编译器之外的任何操作系统级别的包。你可以在没有 Docker 的主机系统上使用pipenv 吗? (geopandas 是如何引起问题的?)
  • 是的,我可以在没有 Docker 的机器上使用 pipenvPipfile 包含为我的应用程序安装的所有必要软件包,正如我所说,除了调试模式之外,docker 容器中的一切都运行良好。 geopandas的问题很复杂,我尝试了多种方式解决,有人建议用docker试试,终于成功了!

标签: docker flask debugging pipenv


【解决方案1】:

首先,回答你的问题:

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

Debug 模式启用--debugger--reload

我在开发过程中使用 Docker 作为我的 Flask 应用程序的运行时取得了巨大的成功。它使开发变得相当容易,特别是当您的应用程序增长一点并且您需要其他服务(如数据库或 redis 实例)时与 Docker compose 配对时。

我有点困惑为什么你的CMD 在你的运行阶段之前,为什么你使用pipenv debugpy 而不是pipenv run debugpy。 (也就是说,我没有使用 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

最后,注意COPY . . will pick up and add to your image 是什么。

【讨论】:

  • CMD 在文件中的位置是由于是 Docker 的菜鸟。谢谢您,您的回答和链接对我帮助很大!
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2020-08-22
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
相关资源
最近更新 更多