Docker-如何等待容器运行

时间:2019-04-06 10:56:56

标签: node.js docker docker-compose

我想为我的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是否处于等待连接状态?

预先感谢

1 个答案:

答案 0 :(得分:1)

按优先顺序排列的几种可能的解决方案:

  1. 配置您的应用程序以在短暂的延迟后重试,并在连接失败过多后最终超时。这是实现可移植性的理想解决方案,也可以用于在应用程序已经运行并连接后处理数据库重启。

  2. 使用一个等待mongo可用的入口点。您可以尝试使用完整的mongo客户端连接+登录,或者使用wait-for-it之类的脚本进行简单的tcp端口检查。一旦检查完成(或超时并失败),您就可以继续进入该点以启动您的应用程序。

  3. 配置docker以使用重新启动策略重试启动您的应用程序,或使用编排进行部署,该编排可在应用程序崩溃时自动恢复。这不是一个理想的解决方案,但是非常易于实现。

这是选项3的示例:

  api:
    image: node
    deploy:
      restart_policy:
        condition: unless-stopped

请注意,查看您的撰写文件时,您在撰写文件中混合使用了v2和v3语法,并且很多选项(如depends_on,link和container_name)在群体模式下无效。您还定义了work_dir之类的设置,实际上应在Dockerfile中完成。

相关问题