【问题标题】:Why can't docker compose find uvicorn module为什么 docker compose 找不到 uvicorn 模块
【发布时间】:2023-02-03 17:24:25
【问题描述】:

我是 docker 的新手,正在尝试对我的 fastapi 应用程序进行 docker 化。 我构建了一个如下所示的 Dockerfile

# syntax=docker/dockerfile:1

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt

RUN apt-get update
RUN apt-get -y install libpq-dev gcc
RUN apt-get -y install libnss3-tools
RUN apt-get -y install curl
RUN curl -LJO https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-amd64
RUN mv mkcert-v1.4.4-linux-amd64 mkcert
RUN chmod +x mkcert
RUN ./mkcert -install
RUN ./mkcert -cert-file cert.pem -key-file key.pem 0.0.0.0 localhost 127.0.0.1 ::1

RUN pip3 install -r requirements.txt

COPY . .

CMD ["python3.8", "-m", "uvicorn", "main:app", "--host=0.0.0.0", "--ssl-keyfile=./key.pem",  "--ssl-certfile=./cert.pem"]

并运行容器,它们都工作了。但是当我尝试将容器与 docker 组合时,它告诉我即使在 requirements.txt 文件中也找不到 uvicorn 模块。 这是我的包含服务器服务的 docker compose 文件的 sn-p。

services:

  server:
    container_name: server
    image: python:3.8-slim-buster
    command: ["python3.8", "-m", "uvicorn", "main:app", "--host=0.0.0.0", "--ssl-keyfile=./key.pem",  "--ssl-certfile=./cert.pem"]
    ports:
      - 8000:8000
    working_dir: /app

我尝试使用将 docker compose 中服务器服务的命令部分更改为

command: bash "python3.8 -m uvicorn main:app --host=0.0.0.0 --ssl-keyfile=./key.pem  --ssl-certfile=./cert.pem"

没用。 改成

command: sh -c "python3.8 -m uvicorn main:app --host=0.0.0.0 --ssl-keyfile=./key.pem  --ssl-certfile=./cert.pem"

没用。

我完全删除了命令它仍然没有用,一直显示

server | /usr/local/bin/python3.8: No module named uvicorn
server exited with code 1

【问题讨论】:

  • 您的image 似乎引用了本地 python-slim-buster 图像,而不是您构建的图像:image: python:3.8-slim-buster - 这应该是对您已经构建的容器镜像.
  • 您为服务设置的映像 (python:3.8-slim-buster) 不是从您的 docker 文件构建的映像。参考文档如何指定定义服务到use a built image from your dockerfile
  • @MatsLindh 非常感谢。它在使用我的自定义构建图像后起作用。
  • @OluwafemiSule 感谢首席,它在这样做之后起作用了。

标签: python docker docker-compose fastapi uvicorn


【解决方案1】:

您在 docker compose 中使用的图像不是之前在 Dockerfile 中构建的图像,而是一个基本的 Python 图像。
您可以从 Dockerfile 构建图像

docker build .  -t fastapi

然后用这样的东西修改你的docker-compose.yml文件

services:
  api:
    image: fastapi
    ports:
      - "8000:8000"

然后运行 ​​docker compose

docker-compose -f docker-compose.yml up

【讨论】:

  • 这样做后它起作用了。非常感谢
【解决方案2】:

似乎 uvicorn 模块未安装在您尝试运行 FastAPI 应用程序的同一环境中。您需要确保运行应用程序的环境与安装所需包的环境相同。

实现此目的的一种方法是使用 bash 命令在 Docker Compose 文件中添加新服务,并在该服务中运行 pip3 install 命令。安装完成后,您可以启动 FastAPI 服务。

这是一个示例 Docker Compose 文件:

版本:'3' 服务: 安装: 建造: 。 命令:sh -c "p​​ip3 install -r requirements.txt"

服务器: 建造: 。 命令:sh -c "p​​ython3.8 -m uvicorn main:app --host=0.0.0.0 --ssl-keyfile=./key.pem --ssl-certfile=./cert.pem"

这将确保在运行 FastAPI 应用程序之前在环境中安装所需的包。

【讨论】:

    猜你喜欢
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2021-10-13
    • 2023-03-26
    相关资源
    最近更新 更多