【问题标题】:FastAPI Docker Container shuts down immediatelyFastAPI Docker 容器立即关闭
【发布时间】:2020-10-01 19:22:31
【问题描述】:

我正在尝试运行一个简单的 FastAPI docker 容器。我唯一的要求是我需要 redis 模块。

这是我的 Dockerfile

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8

COPY ./app /app

CMD pip install -r /app/infrastructure_req.txt

根据日志,pip安装成功

Collecting redis==3.5.3
  Downloading redis-3.5.3-py2.py3-none-any.whl (72 kB)
Installing collected packages: redis
Successfully installed redis-3.5.3
WARNING: You are using pip version 20.0.2; however, version 20.2.3 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
Requirement already satisfied: redis==3.5.3 in /usr/local/lib/python3.8/site-packages (from -r 
/app/infrastructure_req.txt (line 1)) (3.5.3)
WARNING: You are using pip version 20.0.2; however, version 20.2.3 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
Requirement already satisfied: redis==3.5.3 in /usr/local/lib/python3.8/site-packages (from -r 
/app/infrastructure_req.txt (line 1)) (3.5.3)
WARNING: You are using pip version 20.0.2; however, version 20.2.3 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.

但是,docker 容器在 CMD 之后立即退出。

如果我尝试在没有安装 pip 的情况下构建映像,则会收到此错误

# Let the DB start

sleep 10;

# Run migrations

alembic upgrade head


[2020-10-01 19:08:24 +0000] [1] [INFO] Starting gunicorn 20.0.4

[2020-10-01 19:08:24 +0000] [1] [INFO] Listening at: http://0.0.0.0:80 (1)

[2020-10-01 19:08:24 +0000] [1] [INFO] Using worker: uvicorn.workers.UvicornWorker

[2020-10-01 19:08:24 +0000] [7] [INFO] Booting worker with pid: 7

{"loglevel": "info", "workers": 2, "bind": "0.0.0.0:80", "graceful_timeout": 120, "timeout": 120, 
"keepalive": 5, "errorlog": "-", "accesslog": "-", "workers_per_core": 1.0, "use_max_workers": null, 
"host": "0.0.0.0", "port": "80"}

[2020-10-01 19:08:25 +0000] [1] [INFO] Shutting down: Master

[2020-10-01 19:08:25 +0000] [1] [INFO] Reason: Worker failed to boot.

{"loglevel": "info", "workers": 2, "bind": "0.0.0.0:80", "graceful_timeout": 120, "timeout": 120,
"keepalive": 5, "errorlog": "-", "accesslog": "-", "workers_per_core": 1.0, "use_max_workers": null, 

“主机”:“0.0.0.0”,“端口”:“80”}

我不清楚如何解决这个问题。

【问题讨论】:

  • 其实CMD的定义是容器完成后立即退出。您的意思是将RUN pip install 作为您的映像构建的一部分吗?
  • 我用 RUN 替换了 CMD,它仍然在我的原始帖子底部给出了错误列表。

标签: python-3.x docker fastapi


【解决方案1】:

这就是我在 docker 中使用 fastapi 的方式。

FROM python

COPY ./requirements.txt /
RUN pip install -r requirements.txt

WORKDIR /app

CMD ["uvicorn", "main:app", "--reload"]

然后我开始

docker run --rm -d -ti --name fastapi -v $PWD/python-api/app:/app fastapi

如果您不想挂载代码,可以将其复制到构建中。

【讨论】:

    【解决方案2】:

    首先,我要感谢所有回复的人。通过破解和做一些推理,我能够解决我的问题。

    作为将来访问此帖子的人的一个小背景。我正在运行 Windows 10 和 Docker for Desktop,但我正在创建 Linux 映像。我专门使用 tiangolo/uvicorn-gunicorn-fastapi,因为它应该针对生产进行调整。

    这是我的 Dockerfile

    FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8
    
    COPY ./app /app
    
    RUN pip install --upgrade pip
    RUN ls -agl
    RUN pip install -r requirements
    

    第二个运行命令不是必需的,但它确保我的文件和文件夹被正确复制。感谢那些对 CMD vs RUN 做出回应的人。那是(1)我的错误。还要感谢@The Fool 让我知道文件可以挂载。那不是我的问题,但是当我在笔记本电脑上进行本地开发时,这会很方便。如果我将 FastAPI 设置为在检测到新文件时重新加载,这将大大加快开发速度。

    最终我遇到了两个问题,但无论出于何种原因,错误消息都没有显示在 docker 日志中,而是炸毁了 gunicorn:

    问题 #1 我的目录结构和文件如下:

    app/
     |
     -- __init__.py
     -- main.py
     --log_settings/
        |
        |--__init__.py
        |--logging_config.py
        |--loggers.py
    

    由于我的开发环境是如何设置的,我的 main.py 有这个代码

    from app.log_settings import loggers
    

    这是不正确的,应该是:

    from log_settings import loggers
    

    问题 2: 我的代码依赖于 psutils。无论出于何种原因,都没有安装 psutils。我不知道为什么。我使用 pip freeze 并不断遇到问题。我终于删除了这一行,然后在需求列表的最底部输入了 psutils

    这是一个很难调试的问题,因为 docker 日志中没有真正好的错误消息。

    我从创建一个简单的 hello world 开始,然后通过复制和粘贴来添加一些我的代码,直到它再次崩溃。然后我检查了这个问题,修复并继续下一个问题。找出未安装 psutils 并修复该问题导致我收到一条很好的错误消息以修复路径问题。

    我过去曾遇到过 uvicorn 和 gunicorn 的问题,但这是我第一次没有收到告诉我到底发生了什么的消息。我的意思是,所显示的内容只是一个神秘的混乱。

    再次感谢所有回复的人

    【讨论】:

      【解决方案3】:

      我的 FastAPI 的 Dockerfiles 通常会有类似的内容:

      RUN pip install -r /app/infrastructure_req.txt
      
      CMD uvicorn --host=0.0.0.0 app:app
      

      你只能有一个CMD作为主入口点,所以你需要使用RUN安装你的pip模块

      【讨论】:

      • 我不知道你可以运行 req 文件而不复制它。不错。
      【解决方案4】:

      检查您的 dockerfile。您发出的最后一个命令是pip 安装。安装正常,由于没有其他命令,它只是关闭。

      dockerfile 应该如下所示

      FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8
      
      COPY ./app /app
      
      CMD pip install -r /app/infrastructure_req.txt
      
      CMD uvicorn --host=0.0.0.0 app.main:app # or wherever your FastAPI app is located and named
      

      【讨论】:

      • 你只会得到一个CMD;如果有多个,只有最后一个生效。这个表单根本不运行pip
      • 他的 Dockerfile 是这样开始的。他问为什么容器在通过 pip 安装后停止了,我回答了。我只是拿了它,并以他使用的相同格式添加了缺失的行。另外,我注意到很多人正在编写带有多个参数的 CMD 命令,请参阅github.com/nsidnev/fastapi-realworld-example-app/blob/master/… 示例
      猜你喜欢
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 2023-02-13
      相关资源
      最近更新 更多