执行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的配置挂载宿主机目录到容器内,此时看到的路径存在,是因为宿主机目录被挂载过来,而非镜像本身包含该路径。
解决办法可选以下一种:
- 在Dockerfile中提前创建该目录:
构建时路径就会存在,后续挂载的宿主机目录会覆盖这个空目录,不影响实际使用。RUN mkdir -p /app/vendor/libs/my_lib - 如果
my_lib的内容需要在构建阶段就用到,直接把它复制到镜像里:
这种方式会把文件打包进镜像,后续挂载卷会覆盖它,适合构建时必须依赖该内容的场景。COPY /Users/me/libs/my_lib /app/vendor/libs/my_lib - 调整构建逻辑,把依赖
/app/vendor/libs/my_lib的步骤放到容器启动后执行(比如写入启动脚本),而非在Dockerfile的构建阶段执行。
内容的提问来源于stack exchange,提问作者fguillen
相关产品推荐
相关产品推荐

