如何使用 pdm 作为依赖项管理器在多阶段构建上运行 FastAPI 应用程序?

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

我正在尝试使用 pdm 和以下内容运行 FastAPI 应用程序

Dockerfile
:

ARG PYTHON_BASE=3.10-slim

# Build stage
FROM python:$PYTHON_BASE as build

COPY pyproject.toml pdm.lock README.md ./

# Install pdm
RUN python -m pip install --upgrade pip setuptools wheel &&\
    pip install pdm

# Install dependencies
RUN pdm install --no-lock --no-editable


# Run stage
FROM python:$PYTHON_BASE

# Copy application files
COPY src /src
COPY logging_config.yaml .

COPY --from=build /.venv /.venv
ENV PATH="/.venv/bin:{$PATH}"

EXPOSE 5000

CMD ["uvicorn", "src.backend.main:app", "--host", "0.0.0.0", "--port", "5000"]

我的项目结构如下:

backend
|- src/backend
|  |- main.py
|- Dockerfile
|- pdm.lock
|- pyproject.toml
|- README.md

运行以下命令来构建映像并运行容器后,我收到以下错误:

sudo docker build -t backend:v0.1.0 .
sudo docker run -p 5000:5000 backend:v0.1.0

错误:

exec /.venv/bin/uvicorn: no such file or directory

谁能解释一下如何正确设置容器?

起初我以为容器无法找到 uvicorn 的虚拟环境的 PATH,所以我访问了容器的 bash,结果是:

docker run -it backend:v0.1.0 /bin/bash
which uvicorn
>>> /.venv/bin/uvicorn
python docker backend fastapi pdm
1个回答
0
投票

我能够找出问题所在。我似乎在尝试使用 Python 3.10 部署应用程序时使用 Python 3.12 初始化了 pdm 项目。这种不匹配导致容器在创建 3.12 的同时寻找 3.10 venv。所以我只是将基础镜像更新为

python:3.12-slim
,Dockerfile 就按原样工作了。

© www.soinside.com 2019 - 2024. All rights reserved.