Docker容器运行Flask应用报错无法找到run.py文件问题求助
问题根因
你的Dockerfile使用了多阶段构建语法,但未将第一阶段构建的项目文件复制到最终运行的镜像层,最终启动的python:3.9.7-slim镜像里根本不存在/NewBackend目录和run.py文件,CMD指令找不到指定文件就会默认从根路径查找,因此抛出//run.py不存在的报错。
修正方案
你可以根据需求选择以下任意一种方式调整Dockerfile:
方案1:删除冗余的多阶段结构,统一用python基础镜像
你之前的多阶段写法完全没有复用第一阶段的产出,属于无效写法,可以直接简化为单阶段构建:
# 统一使用官方python镜像作为基础,不需要额外引入alpine FROM python:3.9.7-slim WORKDIR /NewBackend # 安装系统依赖 RUN apt-get update \ && apt-get -y install libpq-dev gcc \ && rm -rf /var/lib/apt/lists/* # 复制项目文件 COPY . /NewBackend # 安装python依赖 RUN pip install --upgrade pip \ && pip --no-cache-dir install -r requirements.txt psycopg2 EXPOSE 5000 CMD ["python","run.py"]
方案2:完善多阶段构建逻辑,复用第一阶段产物
如果你确实需要多阶段构建减小最终镜像体积,可以补充第一阶段到第二阶段的文件复制逻辑:
# 第一阶段:构建依赖 FROM python:3.9.7-slim AS builder WORKDIR /NewBackend RUN apt-get update \ && apt-get -y install libpq-dev gcc COPY requirements.txt . RUN pip install --user --no-cache-dir -r requirements.txt psycopg2 # 第二阶段:运行时镜像 FROM python:3.9.7-slim WORKDIR /NewBackend # 复制第一阶段安装的依赖 COPY --from=builder /root/.local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages # 复制项目代码 COPY . /NewBackend EXPOSE 5000 CMD ["python","run.py"]
验证方法
构建镜像后可以先执行以下命令确认run.py是否存在,替换<你的镜像名>为你实际的镜像名称:docker run --rm --entrypoint ls <你的镜像名> /NewBackend
如果输出能看到run.py就说明文件复制正常,再正常启动容器即可。
内容的提问来源于stack exchange,提问作者Fazal Ghani Qureshi
相关产品推荐
相关产品推荐

