多阶段Docker部署Python应用:uvicorn命令找不到问题排查
问题:Python Web应用多阶段Docker构建的依赖执行异常
我通过Jenkins结合多阶段Docker构建Python Web应用,流程为:在Jenkins的builder阶段中,执行pip install --target deps将所有依赖安装到deps目录,随后将该目录复制到Docker镜像,并设置ENV PYTHONPATH=deps:.。但启动镜像运行Python应用时,执行PATH中的命令(如uvicorn)会报错sh: uvicorn not found,即使添加deps/bin到PATH仍无效。直接在镜像中安装虚拟环境则可解决该问题。
相关代码
Dockerfile
FROM Python:3.9-slim as base ENV PYTHONPATH=deps:. FROM base as builder RUN --mount=type=cache,id=apt-cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,id=apt-lib,target=/var/lib/apt,sharing=locked \ apt-get update && apt-get --no-install-recommends install -y build-essential FROM base COPY deps deps COPY app app CMD [uvicorn, app.main:app, --host 0.0.0.0, --port 8000]
Makefile
build: docker build --tag app:builder . deps: clean mkdir deps pip install -r requirements.txt --target deps clean: rm -rf deps
Jenkins任务步骤
- 触发构建builder
- 触发builder执行Makefile的deps阶段
- Docker构建应用镜像
项目结构
│ requirements.txt ├── app │ ├── models │ │ └── registry │ ├── api_router.py │ ├── configuration.py │ ├── main.py │ ├── schemas │ │ │ └── tests │ └── unit └── docs
补充异常细节
仅将deps目录添加到ENV PYTHONPATH=deps:.无效,执行pip list -v无法找到依赖,但pip freeze能列出依赖。
内容的提问来源于stack exchange,提问作者Nikolai Kl
相关产品推荐
相关产品推荐

