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

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服务就绪后再执行构建。

  1. 修改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
  1. 调整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,可以分步骤手动控制流程:

  1. 启动graph服务并等待其就绪:
# 启动graph服务并后台运行
docker-compose up -d graph

# 循环检测graph服务是否就绪,直到可访问
until curl -s http://graph:4000/graphql > /dev/null; do
  echo "等待graph服务就绪..."
  sleep 5
done
  1. 构建web镜像:
docker-compose build web
  1. 启动所有服务(如需):
docker-compose up -d

内容的提问来源于stack exchange,提问作者Daniel van der Meijden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:35:09