如何解决Docker Swarm中的MongoDB初始化
我有一个必须连接到MongoDB实例的NodeJS服务器,它们都在Swarm环境中作为docker容器运行。该数据库包含使用默认过程在启动时创建和填充的集合。
我想确保NodeJS服务将在数据库完成其初始化时启动(而不是在“启动并运行”时启动),但是我不知道如何在Swarm中执行此操作。我认为唯一的选择是:
- 拆分部署,并确保在启动服务器之前等待数据库初始化
- 一起部署,但只要对数据库的查询引发异常或返回空集合,就强制服务器退出
我还有其他方法(在Docker,MongoDB或NodeJS上使用)来处理这种“同步”吗?
解决方法
您也可以始终使用docker compose依赖于某些命令的功能。连续检查条目是否在数据库中。但是也许您需要一个覆盖驱动程序才能使其与swarm一起使用。
driver: overlay
示例:
depends_on:
- "db"
command: ["./wait-for-it.sh","db:5432","--","python","app.py"]
wait-for-it.sh示例
#!/bin/sh
# wait-for-postgres.sh
set -e
host="$1"
shift
cmd="$@"
until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done
>&2 echo "Postgres is up - executing command"
exec $cmd
更新::在Docker-Swarm中不依赖于功能,因为服务获取会在其中自动重启。使用此bash脚本,您可以手动保留服务,直到在DB中填充了所有条目。根据需要更改此bash脚本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。