代码之家  ›  专栏  ›  技术社区  ›  Mihail Bury

无法使用Docker启动Python FastAPI项目

  •  0
  • Mihail Bury  · 技术社区  · 2 年前

    我对编程很陌生,在尝试lauch时出错 fastapi 具有的项目 Docker Poetry .

    以下是我的项目结构:

    .
    ├── backend
    │   ├── Dockerfile
    │   ├── poetry.lock
    │   ├── pyproject.toml
    │   ├── src
    │   │   ├── domain
    │   │   │   └── __init__.py
    │   │   ├── infrastructure
    │   │   │   └── __init__.py
    │   │   ├── __init__.py
    │   │   └── presentation
    │   │       ├── __init__.py
    │   │       └── main.py
    │   └── tests
    │       └── __init__.py
    ├── docker-compose.yaml
    └── README.md
    

    这是Docker文件:

    FROM python:3.11-slim
    
    WORKDIR /backend
    
    COPY . /backend
    
    RUN pip install --upgrade pip && pip install poetry
    RUN poetry install
    
    EXPOSE 8000
    

    和docker-compose.yaml:

    services:
    
      # PostgreSQL
      db:
        image: postgres
        restart: always
        env_file:
          - backend/.env
        ports:
          - '5432:5432'
        healthcheck:
          test: [ "CMD-SHELL", "sh -c 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'" ]
          interval: 10s
          timeout: 3s
          retries: 3
    
      # BackEnd
      backend:
        build:
          context: backend
        command: bash -c 'uvicorn src.presentation.main:app --host 0.0.0.0 --port 8000 --reload'
        ports:
          - '8000:8000'
        volumes:
          - .:/backend
        restart: always
        depends_on:
          db:
            condition: service_healthy
    

    我的 pyproject.toml :

    [tool.poetry]
    name = "startup"
    version = "0.1.0"
    description = ""
    authors = ["RRoxxxsii <[email protected]>"]
    readme = "README.md"
    
    [tool.poetry.dependencies]
    python = "^3.11"
    fastapi = {extras = ["all"], version = "^0.109.0"}
    pytest="^7.4.4"
    pytest-asyncio = "^0.23.3"
    pre-commit = "^3.6.0"
    sqlalchemy = "^2.0.25"
    alembic = "^1.13.1"
    uvicorn = "^0.25.0"
    
    [build-system]
    requires = ["poetry-core"]
    build-backend = "poetry.core.masonry.api"
    

    当我开始项目时 docker compose up 我得到错误:

    bash: line 1: uvicorn: command not found

    我也不明白为什么 uvicorn 在poetry.lock和pyproject.toml内部

    1 回复  |  直到 2 年前
        1
  •  0
  •   Harshel Chaudri    2 年前

    好的,所以我试着复制上面的内容,

    我认为这里有几点需要指出,

    1. 诗歌相关

      • 1a。poetry将在pyproject.toml文件中查找与项目名称相同的目录 在这种情况下,应该是 startup/ 在你的下面 backend/ 目录
      • 1b。如果在下找不到README.md,poetry也会抱怨并无法安装当前项目 后端/ 目录,在本例中为项目“启动”的根目录
    2. Docker相关

      • 在您的撰写文件中,您有主机卷 . 映射到容器目录 /backend ,最重要的是 COPY . /backend ,我怀疑这是一个有趣的覆盖操作,尽管我不能100%确定那里会发生什么,但更熟悉docker安装系统的人会比我更清楚地说明这一点。

    然而,我通过将workdir名称更改为 /后端 喜欢 /service 在以下可重复的示例中

    docker-compose.yml

    services:
    
      # BackEnd
      backend:
        build:
          context: backend
        command: bash -c 'poetry run uvicorn startup.main:app --host 0.0.0.0 --port 8000 --reload'
        ports:
          - '8000:8000'
        volumes:
          - .:/backend
    
    

    Dockerfile

    FROM python:3.11-slim
    
    WORKDIR /service
    
    COPY . /service
    
    RUN pip install --upgrade pip && pip install poetry
    RUN poetry install
    
    EXPOSE 8000
    
    

    目录结构

    .
    ├── backend
    │   ├── Dockerfile
    │   ├── pyproject.toml
    │   ├── README.md
    │   └── startup
    │       ├── __init__.py
    │       └── main.py
    └── docker-compose.yaml