Docker构建报unable to locate files and directories错误排查
问题根因
报错核心是Docker构建上下文边界配置错误,和本地文件实际存放路径没有关系:
- 你执行构建的命令为
docker build -t big_box ./services/big_box,命令最后一个参数指定的是Docker构建上下文目录,Docker只会将这个目录下的内容打包发送给构建引擎,上下文目录外的所有文件(包括和services同级的lib目录、services目录下非big_box的内容)都无法被Dockerfile里的COPY/ADD指令访问。 - 你的Dockerfile中写了
COPY ./services/big_box/pyproject.toml、COPY ./lib ../../lib这类路径,这些路径在你当前指定的./services/big_box构建上下文中根本不存在,自然会抛出文件无法定位的错误。 - 额外问题:你在COPY指令中使用
../../lib这类跨级相对路径作为目标地址,很容易出现容器内路径解析偏差,属于不推荐的写法。
修复方案
按以下两步调整即可解决问题:
- 修改构建命令,将构建上下文切换为项目根目录(也就是你当前执行命令的backend-python目录),同时显式指定Dockerfile的路径:
docker build -t big_box -f ./services/big_box/Dockerfile .
- 调整Dockerfile内的COPY路径配置,使用绝对路径作为复制目标,避免相对路径解析错误,修正后的完整Dockerfile如下:
FROM python:3.9 ENV PYTHONUNBUFFERED True ENV PYTHONPATH /app WORKDIR /app/services/big_box RUN pip install "poetry==1.1.8" COPY ./services/big_box/pyproject.toml \ ./services/big_box/poetry.lock \ ./ COPY ./lib /app/lib RUN poetry config virtualenvs.create false && \ poetry install --no-dev COPY ./services/big_box/src ./src CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 'src.app:create_app()'
调整完成后重新执行构建命令即可正常完成镜像构建。如果担心路径配置有误,可以在执行构建前先在backend-python目录下执行ls ./services/big_box/pyproject.toml、ls ./lib两个命令,确认对应文件存在即可。
内容的提问来源于stack exchange,提问作者Asad Amir Khwaja
相关产品推荐
相关产品推荐

