API 应用程序无法连接到默认网络上 Docker 容器内的 Firebase Auth 模拟器

问题描述 投票:0回答:1

我正在尝试容器化我的 firebase 模拟器数据:

Dockerfile.emulator

FROM node:alpine

RUN apk add --no-cache \
  openjdk11-jre-headless \
  nodejs \
  npm \
  && npm install -g firebase-tools


WORKDIR /app

COPY ./firebase.json firebase.json
# ... I copy other config files too, clipped for brevity

COPY ./emulator-data emulator-data

CMD [ "firebase", "--project=my-project", "emulators:start", "--only", "firestore,auth,storage", "--import", "emulator-data" ]

EXPOSE 4000
EXPOSE 8080
EXPOSE 9099
# I exposed all emulator ports, clipped for brevity

我还在我的

host
中的
emulators
部分中添加了
firebase.json


  "emulators": {
    "singleProjectMode": false,
    "auth": {
      "port": 9099,
      "host": "0.0.0.0"
    },
    "firestore": {
      "port": 8080,
      "host": "0.0.0.0"
    },
    "ui": {
      "enabled": true,
      "host": "0.0.0.0",
      "port": 4000
    }
  },

执行我的撰写文件后成功运行

docker-compose.yml
(相关部分)

version: '3.8'

services:
  emulator:
    container_name: emulator
    image: firestore
    build:
      context: .
      dockerfile: ./dockerfiles/Dockerfile.emulator
    ports:
      - 4000:4000
      - 8080:8080
      - 9099:9099
      # clipped for brevity, I exposed all emulator ports 

  data-api:
    container_name: data-api
    build:
      context: .
      dockerfile: ./apps/data-api/Dockerfile
    ports:
      - 3334:3334
    depends_on:
      - emulator
    env_file:
      - .env
    restart: always

一旦运行

  • 我可以在本地浏览器上访问模拟器 UI
  • 身份验证模拟器在端口 9099 上显示“ON”
  • 进口
    emulator-data
    可用。
  • 我能够登录并从本地服务的 Angular 应用程序接收 Firebase 令牌(网络选项卡显示“127.0.0.1:9099”)

但是,我的 API 应用程序(在 Docker 容器中运行)需要验证令牌,并且在连接到身份验证模拟器时遇到问题。

发出请求时出错:连接 ECONNREFUSED 127.0.0.1:9099。错误代码:ECONNREFUSED

我还确认我设置了以下环境变量(我也尝试过0.0.0.0)

  • process.env['FIRESTORE_EMULATOR_HOST'] = '127.0.0.1:8080'
  • process.env['FIREBASE_AUTH_EMULATOR_HOST'] = '127.0.0.1:9099'

当我在本地运行模拟器和 API 应用程序时,同样的配置也有效,所以我认为它与容器有关,而不是我的 API 应用程序中的连接信息。

即使我本地运行的前端可以,我的

data-api
容器也无法与
emulator
容器通信,是否有原因?我是否错误地配置了端口?这些应用程序不是都在同一个默认网络上吗?

firebase docker docker-compose firebase-authentication firebase-tools
1个回答
0
投票

对于要连接到另一个容器的 docker 容器,需要引用容器的名称而不是数字主机地址。在我的例子中,API 容器需要引用主机

emulator
(模拟器容器的名称)

  • process.env['FIRESTORE_EMULATOR_HOST'] = '模拟器:8080'
  • process.env['FIREBASE_AUTH_EMULATOR_HOST'] = '模拟器:9099'
© www.soinside.com 2019 - 2024. All rights reserved.