我正在尝试在 Docker 中操作 DeepDetect(机器学习服务器)[请注意,这不是 DeepDetect 问题 - 它只是一个 Bash 问题]。但是,我遇到了一个更常见的 Linux/bash 问题,希望得到帮助。
这是我需要做的:
从通过 Dockerfile ENTRYPOINT 启动的 shell 脚本,启动 DeepDetect 服务器,阻止它(它是一个服务器,因此它应该永远运行)。我希望运行此脚本的脚本成为根进程,这样如果它崩溃,Docker 将重新启动容器。
后服务器正在运行,从同一脚本,向上面正在运行的服务器发送如下 curl:
curl-X 放“http://localhost/services/age“-d'{“mllib”:“caffe”,“description”:“年龄分类”,“type”:“supervised”,“parameters”:{“input”:{“connector”:“图像”,“height”:227,“width”:227},“mllib”:{“nclasses”:8}},“model”:{“repository”:“/models/age_model”}}'
好的,所以我的问题是这样 - 如果服务器一直在运行,我该如何运行 curl?似乎我需要在服务器启动之前以某种方式在后台启动另一个进程,然后在服务器启动后返回并运行上述 curl 表达式。
有人知道如何解决这个“30 秒内调用脚本”的问题吗?任何帮助都非常感谢!
答案1
对于基本问题:
#!/usr/bin/env bash
./start-server.sh &
sleep 30
curl […]
wait
现在不可避免地会出现问题sleep 30
- 有时服务器可能需要更长时间才能启动,或者它可能在curl
运行时恰好处于重新启动过程中。您可以添加许多复杂性来重试或检查服务器是否可用(通常使用不同的curl
)然后再执行您想要的操作。
答案2
DeepDetect 服务器应该在容器中守护进程(作为 pid 1 运行):
CMD ["deepdetect"]
在入口点脚本中,您可以使用简单的 while 循环等待服务器:
while ! $(curl --output /dev/null --silent --head --fail
http://localhost:80); do
>&2 echo "Server is unavailable - sleeping"
sleep 1
done
我没有检查过这一点,但无论如何你都可以尝试这个想法。此外,你应该对入口点和 cmd 使用 exec 格式(而不是 shell):
ENTRYPOINT ["/entrypoint.sh"]