为什么docker-compose.yaml中指定了卷却找不到uvicorn?

问题描述 投票:0回答:1

我正在设置用于开发的 fastapi compose.yaml 文件。

这是我的项目的简化布局:

Dockerfile -> 大小优化:170MB


    # The builder image, used to build the virtual environment
    FROM python:3.11-bullseye as builder
    
    # Install package manager
    RUN pip install poetry==1.7.1
    
    # Define environment
    ENV POETRY_NO_INTERACTION=1 \
        POETRY_VIRTUALENVS_IN_PROJECT=1 \
        POETRY_VIRTUALENVS_CREATE=1 \
        POETRY_CACHE_DIR=/tmp/poetry_cache
    
    # Set work directory
    WORKDIR /app
    
    # Copy project dependencies
    COPY pyproject.toml poetry.lock ./
    # Install production dependencies only and remove poetry cache directory
    RUN poetry install --without dev --no-root && rm -rf $POETRY_CACHE_DIR
    
    # The runtime image, used to run the service
    FROM python:3.11-slim-bullseye as runtime
    
    # Set virtual environment path and add it to the system Path
    ENV VIRTUAL_ENV=/app/.venv \
        PATH="/app/.venv/bin:$PATH"
    
    # Copy project dependencies from builder stage
    COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}
    
    # Copy project code
    COPY app/ /app/
    
    # Run service
    CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

在 debian 容器中生成的布局是相同的,所以一切都很好,当我运行容器时,它部署了一个运行完美的 fastapi 服务器!

我想创建一个开发环境来监视我的代码并在每次更改时重新加载服务器。

为此,我创建了以下 compose.yaml:


    services:
      api:
        image: pws
        build:
          context: .
          dockerfile: Dockerfile
        restart: on-failure
        ports:
          - "80:80"
        volumes:
          # - ./app/:/app   # I have tried many combinations of this line
          - ./app/:/app/
        command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--reload"]

问题是,当未指定“卷”时,运行“docker compose up”运行良好,但目前我尝试包含它,但出现了问题:

错误: 来自守护进程的错误响应:无法为容器创建任务:无法创建 shim 任务:OCI 运行时创建失败:runc 创建失败:无法启动容器进程:exec:“uvicorn”:在 $PATH 中找不到可执行文件:未知

docker docker-compose command fastapi uvicorn
1个回答
0
投票

我找到了使用 docker compose watch 的解决方法,但仍然对使用“卷”进行绑定挂载时发生的情况感到好奇

services:
  api:
    image: pws
    build:
      context: .
      dockerfile: Dockerfile
    container_name: pws
    environment:
      - WATCHFILES_FORCE_POLLING=true
    restart: on-failure
    ports:
      - "80:80"
    develop:
      watch:
        - action: sync
          path: ./app/
          target: /app/
          ignore:
            - .venv/
    command: ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80", "--reload"]
© www.soinside.com 2019 - 2024. All rights reserved.