我正在尝试部署 3 个 Docker 容器,它们之间有依赖关系 (A -> B -> C)。现在,每个容器都应该在 JVM 实例上运行一个 Akka-Spray 实例。
问题是:按照通常的编排方法,容器 A 已启动,但 Web 服务器尚未启动。如果容器 B 运行之前 Web 服务器未启动并运行,容器 B 将永远无法跟上,依此类推,直到容器 C 运行。
我最近一直在尝试以下方法:在容器之间共享数据卷;在 Web 服务器准备就绪后,帮助脚本将在该卷中创建一个空文件;运行一个脚本(通过 Upstart 服务)来查找要显示的空文件并启动下一个容器。
但是,使用服务很可能是导致此问题的原因:运行
sudo docker run -d -it --name=backend -v ~/docker-test/:/docker-test -v ~/aux/:/aux ubuntu /bin/bash -c "</path/to/test/script>"
在命令行中简单完成时工作正常,但在 Upstart 服务执行的脚本(接收消息"/bin/bash </path/to/test/script> : no such file or directory"
)中随机失败。
有人也遇到过这种情况吗?我非常欢迎任何解决此问题的建议。
答案1
为什么不看看专门构建的 Docker 协调器,如 flynn、deis、shipyard 等?
相当多的清单这里
答案2
一个选项是等待远程网络端口打开,这表明 Web 服务器已启动。以下代码基于SuperUser 上的这个帖子
#!/bin/sh
SERVICE_IP=`sudo docker inspect -f \"{{.NetworkSettings.IPAddress}}\" $CONTAINER_NAME`
SERVICE_PORT=80
while ! nc -vz \$SERVICE_IP \$SERVICE_PORT; do sleep 1; done
这可以与容器构建编排器相结合(如果该编排器本身不支持等待“容器端口启动”——我不知道在这个方向上有什么可用的)。