![Как запустить блокирующий процесс (сервер), а затем выполнить его curl из того же скрипта?](https://rvso.com/image/726376/%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%20(%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80)%2C%20%D0%B0%20%D0%B7%D0%B0%D1%82%D0%B5%D0%BC%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B5%D0%B3%D0%BE%20curl%20%D0%B8%D0%B7%20%D1%82%D0%BE%D0%B3%D0%BE%20%D0%B6%D0%B5%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%3F.png)
Я пытаюсь запустить DeepDetect (сервер машинного обучения) в Docker [обратите внимание, что это не вопрос по DeepDetect — это просто вопрос по Bash]. Однако я столкнулся с более общей проблемой Linux/bash, и надеюсь получить помощь по ее решению.
Вот что мне нужно сделать:
Из скрипта оболочки, запущенного через Dockerfile ENTRYPOINT, запустите сервер DeepDetect, заблокируйте его (это сервер, поэтому он должен работать вечно). Я хочу, чтобы скрипт, запускающий это, был корневым процессом, чтобы в случае его сбоя Docker перезапустил контейнер.
Послесервер запущен, из того же скрипта отправьте curl следующим образом на указанный выше работающий сервер:
curl -X PUT "http://localhost/services/age" -d '{ "mllib":"caffe", "description":"возрастная классификация", "type":"supervised", "parameters":{ "input":{ "connector":"image", "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
Я не проверял это, но вы можете попробовать эту идею в любом случае. Также вы должны использовать формат exec для entrypoint и cmd (не shell):
ENTRYPOINT ["/entrypoint.sh"]