我想为我的Web应用程序启动三个容器。
容器是:前端,后端和mongo数据库。
为此,我编写了以下docker-compose.yml
version: '3.7'
services:
web:
image: node
container_name: web
ports:
- "3000:3000"
working_dir: /node/client
volumes:
- ./client:/node/client
links:
- api
depends_on:
- api
command: npm start
api:
image: node
container_name: api
ports:
- "3001:3001"
working_dir: /node/api
volumes:
- ./server:/node/api
links:
- mongodb
depends_on:
- mongodb
command: npm start
mongodb:
restart: always
image: mongo
container_name: mongodb
ports:
- "27017:27017"
volumes:
- ./database/data:/data/db
- ./database/config:/data/configdb
并更新.env文件上的连接字符串
MONGO_URI = 'mongodb://mongodb:27017/test'
我用docker-compose up -d
运行它,然后继续。
问题是当我运行docker logs api -f
来监视后端状态时:我有MongoNetworkError: failed to connect to server [mongodb:27017] on first connect
错误,因为我的mongodb容器已启动但未处于等待连接状态(后端尝试连接后该端口上升了)。
如何在运行api容器之前检查mongodb是否处于等待连接状态?
预先感谢
答案 0 :(得分:1)
按优先顺序排列的几种可能的解决方案:
配置您的应用程序以在短暂的延迟后重试,并在连接失败过多后最终超时。这是实现可移植性的理想解决方案,也可以用于在应用程序已经运行并连接后处理数据库重启。
使用一个等待mongo可用的入口点。您可以尝试使用完整的mongo客户端连接+登录,或者使用wait-for-it之类的脚本进行简单的tcp端口检查。一旦检查完成(或超时并失败),您就可以继续进入该点以启动您的应用程序。
配置docker以使用重新启动策略重试启动您的应用程序,或使用编排进行部署,该编排可在应用程序崩溃时自动恢复。这不是一个理想的解决方案,但是非常易于实现。
这是选项3的示例:
api:
image: node
deploy:
restart_policy:
condition: unless-stopped
请注意,查看您的撰写文件时,您在撰写文件中混合使用了v2和v3语法,并且很多选项(如depends_on,link和container_name)在群体模式下无效。您还定义了work_dir之类的设置,实际上应在Dockerfile中完成。