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

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:

修正说明

  1. 移动卷定义到顶级:把原来嵌套在express服务里的nodemodules:卷定义移到了文件最底部,和services平级,这样Compose就能正确识别这是一个全局命名卷。
  2. 移除重复的volumes字段:现在express服务里的volumes只负责配置挂载规则,没有冲突了。
  3. 优化image配置:注释掉了服务里的image字段,建议把基础镜像的定义放在你的Dockerfile中(比如FROM node:12-alpine),这样构建出来的镜像才是你需要的服务镜像。

现在再运行docker-compose up应该就不会报那个错误了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:57:50