You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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这些文件——哪怕路径写对了也没用。

解决步骤

  1. 切换到正确目录执行构建命令
    打开终端,先进入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
    
  2. 优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:02:31