我正在尝试容器化我的 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
一旦运行
emulator-data
可用。但是,我的 API 应用程序(在 Docker 容器中运行)需要验证令牌,并且在连接到身份验证模拟器时遇到问题。
发出请求时出错:连接 ECONNREFUSED 127.0.0.1:9099。错误代码:ECONNREFUSED
我还确认我设置了以下环境变量(我也尝试过0.0.0.0)
当我在本地运行模拟器和 API 应用程序时,同样的配置也有效,所以我认为它与容器有关,而不是我的 API 应用程序中的连接信息。
即使我本地运行的前端可以,我的
data-api
容器也无法与 emulator
容器通信,是否有原因?我是否错误地配置了端口?这些应用程序不是都在同一个默认网络上吗?
对于要连接到另一个容器的 docker 容器,需要引用容器的名称而不是数字主机地址。在我的例子中,API 容器需要引用主机
emulator
(模拟器容器的名称)