使用Docker时如何通过COPY命令引用其他子目录中的文件?
Docker构建文件找不到问题排查与解决
项目目录结构
project \---- file1.dockerfile \---- scripts \-- venv.sh \-- task-name \-- run-script.sh \---- data \-- data1.json
Dockerfile内容
FROM python:3.10.10 WORKDIR /app COPY ./scripts/venv.sh ./scripts/task-name/run-script.sh ./data/data1.json /app/ RUN /app/venv.sh && poetry shell CMD ["bash", "/app/run-script.sh"]
构建错误信息
ERROR: failed to solve: failed to solve with frontend dockerfile.v0: failed to build LLB: failed to compute cache key: "/scripts/venv.sh" not found: not found
用户操作尝试
将COPY语句改为COPY . .,但问题仍未解决。
补充说明
Poetry是在第一个shell脚本(venv.sh)中初始化的。
问题原因与解决方案
核心问题:构建上下文路径错误
你遇到的文件找不到错误,本质是Docker构建上下文指定错误导致的。Docker的COPY指令里的路径是相对于「构建上下文」的,而构建上下文是你执行docker build时最后指定的路径(默认是当前工作目录)。如果执行命令时不在project目录下,或者没有把project目录作为构建上下文,Docker就找不到scripts/venv.sh这些文件——哪怕路径写对了也没用。
解决步骤
切换到正确目录执行构建命令
打开终端,先进入project目录,然后执行:docker build -t your-image-name -f file1.dockerfile .这里的
.就是告诉Docker把当前目录(project)作为构建上下文,这样Docker就能找到scripts、data等子目录里的文件。如果无法切换到
project目录,也可以直接指定上下文路径:docker build -t your-image-name -f /绝对路径/project/file1.dockerfile /绝对路径/project优化Dockerfile(可选但推荐)
原COPY语句把多个文件直接复制到/app根目录,会打乱原有文件结构,改成按目录复制更清晰:FROM python:3.10.10 WORKDIR /app COPY ./scripts /app/scripts COPY ./data /app/data RUN /app/scripts/venv.sh CMD ["bash", "/app/scripts/task-name/run-script.sh"]另外,
RUN /app/venv.sh && poetry shell里的poetry shell是交互式命令,在Docker的RUN阶段执行会失败(无交互式终端)。建议在venv.sh中用poetry install这类非交互式命令完成依赖安装,后续直接通过poetry run调用脚本,或者直接使用虚拟环境内的命令。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

