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

如何通过Oracle JET容器访问Node容器?Docker-Compose配置求助

解决Oracle JET容器无法访问Node API的问题

咱们先理清楚核心问题:你在Oracle JET里设置的API地址,请求其实是从用户的浏览器发起的,而不是从sam-jet容器内部发起的——这就是两种地址都失效的原因:

  • http://localhost:3000/sam:浏览器能解析localhost,但Node服务默认会阻止跨域请求(CORS限制);
  • http://app:3000/sam:浏览器不知道Docker Compose内部的DNS服务,根本识别不了app这个主机名。

下面给你两种针对性的解决方案,分别适配开发和生产场景:


方法一:开发环境快速解决——给Node服务开启跨域支持

这是最快捷的开发调试方案,直接让Node服务允许来自JET前端的跨域请求:

  1. 如果你的Node服务用Express框架,先安装cors依赖:
    npm install cors --save
    
  2. 在Node的入口文件里引入并启用CORS:
    const cors = require('cors');
    const express = require('express');
    const app = express();
    
    // 开发环境可以直接允许所有来源(生产环境建议限制特定域名)
    app.use(cors());
    
    // 或者更严谨地只允许JET的域名:
    // app.use(cors({ origin: 'http://localhost:8000' }));
    
    // 你的API路由配置
    app.use('/sam', yourApiRouter);
    
    // 注意:启动服务时要监听0.0.0.0,确保容器外部能访问
    app.listen(3000, '0.0.0.0', () => {
      console.log('Node API running on port 3000');
    });
    
  3. 重新构建Node服务镜像,重启容器后,前端代码里用http://localhost:3000/sam就能正常访问API了。

方法二:生产环境优雅方案——用Nginx反向代理消除跨域

生产环境不建议直接开放跨域,最好通过Nginx把JET和Node服务统一到同一个域名下,彻底避免跨域问题:

  1. 修改你的docker-compose.yml,添加Nginx服务,同时去掉JET和Node的对外端口映射(让它们只在内部网络通信):
    version: "2"
    services:
      jet:
        container_name: sam-jet
        image: amazus/sam-ui
        depends_on:
          - app
      app:
        container_name: sam-node
        restart: always
        image: amazus/sam-apis
        depends_on:
          - mongo
      mongo:
        container_name: sam-mongo
        image: amazus/sam-data
        ports:
          - "27017:27017"
      nginx:
        container_name: sam-nginx
        image: nginx:alpine
        ports:
          - "80:80"
        volumes:
          # 把自定义的Nginx配置文件挂载到容器内,路径根据你的实际情况调整
          - ./nginx.conf:/etc/nginx/nginx.conf
        depends_on:
          - jet
          - app
    
  2. 在同级目录创建nginx.conf配置文件,设置反向代理规则:
    events {}
    http {
      server {
        listen 80;
    
        # 转发JET UI的请求到jet容器
        location / {
          proxy_pass http://jet:8000;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
        }
    
        # 转发API请求到node容器
        location /sam {
          proxy_pass http://app:3000/sam;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
        }
      }
    }
    
  3. 修改Oracle JET的API地址为相对路径/sam,这样请求会自动通过Nginx转发到Node服务。
  4. 启动所有容器:docker-compose up -d,访问http://localhost就能正常使用JET UI并调用API了。

额外检查点

  • 确认Node服务监听的是0.0.0.0而不是127.0.0.1,否则容器外部(包括其他容器)无法访问;
  • 可以用docker-compose exec app curl http://app:3000/sam测试Node容器内部能否正常访问自身API,排查服务是否正常启动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:46:39