![Como iniciar um processo de bloqueio (servidor) e depois enrolá-lo no mesmo script?](https://rvso.com/image/726376/Como%20iniciar%20um%20processo%20de%20bloqueio%20(servidor)%20e%20depois%20enrol%C3%A1-lo%20no%20mesmo%20script%3F.png)
Estou tentando operar o DeepDetect (um servidor de aprendizado de máquina) no Docker [observe que esta não é uma pergunta do DeepDetect - é simplesmente uma pergunta do Bash]. No entanto, estou me deparando com um problema mais geral do Linux/bash para o qual espero obter ajuda.
Aqui está o que preciso fazer:
A partir de um script shell iniciado via Dockerfile ENTRYPOINT, inicie o servidor DeepDetect, bloqueie-o (é um servidor, portanto deve funcionar para sempre). Quero que o script que executa este seja o processo raiz, para que, se travar, o Docker reinicie o contêiner.
Depoiso servidor está em execução, a partir do mesmo script, envie um curl da seguinte maneira para o servidor em execução acima:
curl -X COLOCAR "http://localhost/services/age" -d '{ "mllib":"caffe", "description":"classificação etária", "type":"supervisionado", "parâmetros":{ "input":{ "conector":"imagem", "altura ":227, "width":227 }, "mllib":{ "nclasses":8 } }, "model":{ "repository":"/models/age_model" } }'
OK, então aqui está o meu problema - como posso executar o curl se o servidor estiver funcionando para sempre? Parece que preciso iniciar de alguma forma outro processo em segundo plano antes de o servidor iniciar, que volta depois que o servidor é iniciado e executa a expressão curl acima.
Alguém tem alguma idéia de como resolver esse problema de "script de chamada em 30 segundos"? Qualquer ajuda é muito apreciada!
Responder1
Para a pergunta básica:
#!/usr/bin/env bash
./start-server.sh &
sleep 30
curl […]
wait
Agora, inevitavelmente, haverá problemas com sleep 30
- às vezes o servidor pode demorar mais para inicializar ou pode estar no processo de reinicialização exatamente quando curl
é executado. Você pode adicionar muita complexidade para tentar novamente ou verificar se o servidor está disponível (normalmente com um arquivo curl
) antes de fazer o que deseja.
Responder2
O servidor DeepDetect deve ser daemonizado no contêiner (executado como pid 1):
CMD ["deepdetect"]
No script do ponto de entrada você pode esperar pelo servidor usando um loop while simples:
while ! $(curl --output /dev/null --silent --head --fail
http://localhost:80); do
>&2 echo "Server is unavailable - sleeping"
sleep 1
done
Eu não verifiquei isso, mas você pode tentar essa ideia de qualquer maneira. Além disso, você deve usar o formato exec para ponto de entrada e cmd (não shell):
ENTRYPOINT ["/entrypoint.sh"]