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

执行docker compose build时报路径不存在,但容器内路径存在

问题

我的docker-compose.yml配置如下:

volumes:
  - .:/web
  - /Users/me/libs/my_lib:/app/vendor/libs/my_lib

容器启动后,执行docker inspect -f '{{ .Mounts }}' 9f201ab87498能看到卷已挂载:

❯ docker inspect -f '{{ .Mounts }}' 9f201ab87498
[{bind  /Users/me/projects/my_project /web  rw true rprivate} {bind  /Users/me/libs/my_lib /app/vendor/libs/my_lib  rw true rprivate}]

但执行docker compose build时出现错误:

17.16 The path `/app/vendor/libs/my_lib` does not exist.

我的Dockerfile中有步骤会用到这个路径,而进入容器后执行ls -l /app/vendor/libs/my_lib能看到该路径确实存在:

❯ docker compose run project bash
de619d38bc2e:/web# ls -l /app/vendor/libs/my_lib
total 32
[...]

Docker版本:27.0.3,build 7d4bcd8

原因与解决办法

核心问题是**docker compose build构建镜像时,不会加载docker-compose.yml里的卷挂载配置**。

  • 构建阶段(build):Docker只会执行Dockerfile里的指令,此时宿主机的卷还没挂载到容器中,镜像本身不存在/app/vendor/libs/my_lib路径,所以Dockerfile里依赖该路径的步骤会报错。
  • 运行阶段(run/up):启动容器时,Docker才会按照docker-compose.yml的配置挂载宿主机目录到容器内,此时看到的路径存在,是因为宿主机目录被挂载过来,而非镜像本身包含该路径。

解决办法可选以下一种:

  1. 在Dockerfile中提前创建该目录:
    RUN mkdir -p /app/vendor/libs/my_lib
    
    构建时路径就会存在,后续挂载的宿主机目录会覆盖这个空目录,不影响实际使用。
  2. 如果my_lib的内容需要在构建阶段就用到,直接把它复制到镜像里:
    COPY /Users/me/libs/my_lib /app/vendor/libs/my_lib
    
    这种方式会把文件打包进镜像,后续挂载卷会覆盖它,适合构建时必须依赖该内容的场景。
  3. 调整构建逻辑,把依赖/app/vendor/libs/my_lib的步骤放到容器启动后执行(比如写入启动脚本),而非在Dockerfile的构建阶段执行。

内容的提问来源于stack exchange,提问作者fguillen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:02:32