我正在尝试使用 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 3.10 部署应用程序时使用 Python 3.12 初始化了 pdm 项目。这种不匹配导致容器在创建 3.12 的同时寻找 3.10 venv。所以我只是将基础镜像更新为
python:3.12-slim
,Dockerfile 就按原样工作了。