Docker Compose文件无效报错排查:已指定build context仍异常
解决Docker Compose报错:Service volumes have neither an image nor a build context specified
嘿,我一眼就看到问题出在哪了——你的docker-compose.yml里有两个关键错误,导致Compose解析时混淆了卷的定义和挂载配置:
错误1:服务内部错误定义了命名卷
你在express服务里写了两次volumes字段:
- 第一次是正确的挂载配置(绑定本地代码目录到容器,挂载
nodemodules卷); - 第二次却把
nodemodules:放在了服务内部的volumes里,这完全不对!命名卷的定义必须放在整个Compose文件的顶级位置(和services同级),不能嵌套在某个服务里。
错误2:同时指定image和build(非致命,但容易混淆)
你的express服务同时写了image: node:12-alpine和build: .,虽然Compose允许这种配置(默认会优先使用构建出来的镜像),但如果你的目标是构建自己的Node服务,应该在Dockerfile里指定FROM node:12-alpine,而不是在这里写image字段,避免混淆。
修正后的完整docker-compose.yml
version: '3.4' services: express: container_name: express # 如果你是通过Dockerfile构建服务,建议把基础镜像定义移到Dockerfile的FROM指令里 # image: node:12-alpine build: . working_dir: /app command: npm run dev ports: - '4000:4000' environment: - NODE_ENV=development - PORT=4000 volumes: - type: bind source: ./ target: /app - type: volume source: nodemodules target: /app/node_modules volume: nocopy: true links: - mongo mongo: container_name: mongo image: mongo volumes: - ./data:/data/db ports: - '27017:27017' - '27018:27018' - '27019:27019' # 命名卷的定义必须放在这里,和services同级 volumes: nodemodules:
修正说明
- 移动卷定义到顶级:把原来嵌套在
express服务里的nodemodules:卷定义移到了文件最底部,和services平级,这样Compose就能正确识别这是一个全局命名卷。 - 移除重复的
volumes字段:现在express服务里的volumes只负责配置挂载规则,没有冲突了。 - 优化
image配置:注释掉了服务里的image字段,建议把基础镜像的定义放在你的Dockerfile中(比如FROM node:12-alpine),这样构建出来的镜像才是你需要的服务镜像。
现在再运行docker-compose up应该就不会报那个错误了!
内容的提问来源于stack exchange,提问作者thatguy
相关产品推荐
相关产品推荐

