使用Docker Compose部署Form.io遇API连接错误,求解决方案
解决Docker Compose部署Form.io的API连接问题
问题根源分析
你遇到的TypeError: Could not connect to API server (Failed to fetch)错误,大概率由以下原因导致:
- MongoDB配置冲突:空的
MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD可能引发MongoDB启动异常,或Form.io的连接字符串与认证状态不匹配 - 容器依赖顺序未明确:Form.io启动时MongoDB可能尚未就绪,导致连接失败
- 本地目录挂载覆盖容器内容:
./:/app:rw挂载会覆盖容器内预安装的依赖文件,若本地无node_modules,应用无法正常启动 - 网络通信异常:虽配置了自定义网络,但容器间的通信链路可能未正确建立
正确部署配置与步骤
1. 编写Form.io的Dockerfile
在项目根目录创建Dockerfile,确保镜像内正确安装依赖:
# 使用Form.io推荐的Node.js 14基础镜像 FROM node:14-alpine # 设置工作目录 WORKDIR /app # 复制依赖文件并安装生产环境依赖 COPY package*.json ./ RUN npm install --production # 复制应用代码 COPY . . # 暴露应用端口 EXPOSE 3001 # 启动Form.io服务 CMD ["node", "server.js"]
2. 调整docker-compose.yml配置
services: mongo: image: mongo:4.2 restart: always volumes: - mdb-data:/data/db networks: - app-mongo # 若不需要MongoDB认证,直接移除以下环境变量;若需要认证,设置具体用户名和密码 # environment: # MONGO_INITDB_ROOT_USERNAME: root # MONGO_INITDB_ROOT_PASSWORD: your-secure-password formio: build: ./ restart: always # 明确依赖MongoDB,确保Mongo先启动 depends_on: - mongo ports: - '3001:3001' # 仅挂载需要持久化的目录,避免覆盖容器内的node_modules volumes: - ./config:/app/config:rw - ./uploads:/app/uploads:rw networks: - app-mongo environment: DEBUG: formio:* # 若Mongo启用认证,连接字符串改为:mongodb://root:your-secure-password@mongo:27017/formio?authSource=admin NODE_CONFIG: '{"mongo": "mongodb://mongo:27017/formio"}' ROOT_EMAIL: admin@example.com ROOT_PASSWORD: CHANGEME stdin_open: true tty: true # 声明持久化卷 volumes: mdb-data: # 声明自定义网络 networks: app-mongo: driver: bridge
3. 部署启动步骤
- 确保项目根目录包含Form.io的代码文件和正确的
package.json - 执行构建与启动命令:
docker-compose build docker-compose up -d
- 查看Form.io容器日志,验证启动状态:
docker-compose logs formio
- 等待1-2分钟,待服务完全就绪后访问
http://localhost:3001
额外注意事项
- 若必须挂载整个
/app目录,需先在本地执行npm install安装依赖,避免容器内缺少依赖文件 - 生产环境建议启用MongoDB认证,并将
ROOT_PASSWORD修改为强密码 - 若仍出现连接问题,可进入Form.io容器执行
ping mongo,验证容器间网络连通性
内容的提问来源于stack exchange,提问作者João Paulo Sapi de Paula
相关产品推荐
相关产品推荐

