Docker Compose构建阶段如何访问默认网络中的后端服务?
问题分析与解决方案
问题根源
你遇到的构建失败,核心原因是Docker镜像构建阶段与容器运行阶段的网络隔离:
docker-compose build是构建web镜像的过程,此时graph容器还未启动,即便指定network: default,也无法通过graph主机名访问后端服务。- 运行时容器启动后,所有服务处于同一默认网络,因此能正常访问
http://graph:4000/graphql。 - 另外,
depends_on仅控制容器启动顺序,不会等待graph服务完全就绪(比如API端口开放)就开始构建web。
解决方案
方案一:将Next.js构建移至容器启动时执行
把next build从镜像构建阶段(Dockerfile的RUN命令)移到容器启动时执行,配合等待逻辑确保graph服务就绪后再执行构建。
- 修改web服务的Dockerfile:
FROM node:18-alpine WORKDIR /app # 复制依赖文件并安装 COPY package*.json ./ RUN npm ci # 安装等待工具,用于检测graph服务端口是否可用 RUN wget -O /usr/local/bin/wait-for-it https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh \ && chmod +x /usr/local/bin/wait-for-it # 复制项目代码 COPY . . # 等待graph服务的4000端口就绪后,执行构建并启动服务 CMD wait-for-it graph:4000 -- npm run build && npm run start
- 调整docker-compose.yml的web配置(移除构建阶段的network指定):
version: "3.9" services: graph: container_name: graph image: graph-image env_file: - ./graph/.env.prod build: ./graph web: container_name: web image: web-image env_file: - ./web/.env.prod build: ./web depends_on: - graph
方案二:先启动graph服务,再构建web镜像
如果必须在镜像构建阶段执行next build,可以分步骤手动控制流程:
- 启动graph服务并等待其就绪:
# 启动graph服务并后台运行 docker-compose up -d graph # 循环检测graph服务是否就绪,直到可访问 until curl -s http://graph:4000/graphql > /dev/null; do echo "等待graph服务就绪..." sleep 5 done
- 构建web镜像:
docker-compose build web
- 启动所有服务(如需):
docker-compose up -d
内容的提问来源于stack exchange,提问作者Daniel van der Meijden
相关产品推荐
相关产品推荐

