FastAPI通过Dockerfile可正常运行,使用docker-compose启动失败
问题:Docker Compose启动FastAPI容器提示uvicorn找不到
我有一个以FastAPI为后端、React为前端的项目,单独使用以下Dockerfile运行FastAPI时一切正常,且已通过curl验证:
FROM python WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY ./app . ENV PYTHONUNBUFFERED=1 ENV PYTHONDONTWRITEBYTECODE=1 EXPOSE 8000 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
但使用以下docker-compose.yml配置启动时,后端容器报错:
version: "3.9" services: backend: container_name: backend build: ./FastAPI ports: - "8000:8000" depends_on: - redis command: uvicorn main:app --host 0.0.0.0 --port 8000 --reload frontend: container_name: frontend build: ./React/react-app ports: - "3000:3000" depends_on: - backend redis: container_name: redis image: "redis:alpine"
错误信息:
Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "uvicorn": executable file not found in $PATH: unknown
docker-composeprocess finished with exit code 1
解决方案
方案1:改用Python模块方式启动uvicorn
修改docker-compose.yml中后端服务的command为数组格式,通过python -m调用uvicorn,彻底避免PATH路径问题:
command: ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
方案2:将command改为exec数组格式
直接把docker-compose中的command改成和Dockerfile里CMD一致的数组形式,避免shell解析PATH时的差异:
command: ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
方案3:明确添加PATH路径(可选)
如果需要保留shell格式的command,可以修改Dockerfile,确保uvicorn所在目录被加入系统PATH:
FROM python WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 明确添加pip默认安装可执行文件的目录到PATH ENV PATH="/usr/local/bin:${PATH}" COPY ./app . ENV PYTHONUNBUFFERED=1 ENV PYTHONDONTWRITEBYTECODE=1 EXPOSE 8000 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
内容的提问来源于stack exchange,提问作者Dorialean
相关产品推荐
相关产品推荐

