Eu tenho uma imagem do docker executando o supervisord em um pod de kubernetes. Eu gostaria que a saída de processos em execução via supervisord apareça nos logs do k8s. Parece que a maneira mais simples de fazer isso é fazer com que os subprocessos gravem diretamente no stdout do supervisord. Para esse fim, posso executar o seguinte hack horrível:
root@714811eb811b:/tmp# cat a.sh
#!/bin/sh
exec > /proc/$(cat /tmp/supervisord.pid)/fd/1
echo This text goes to the k8s log
root@714811eb811b:/tmp# cat config
[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
[program:write]
command=/tmp/a.sh
exitcodes=0
root@714811eb811b:/tmp# supervisord -c config
2017-12-02 00:34:14,245 CRIT Supervisor running as root (no user in config file)
2017-12-02 00:34:14,248 INFO supervisord started with pid 451
2017-12-02 00:34:15,256 INFO spawned: 'write' with pid 454
This text goes to the k8s log
2017-12-02 00:34:15,262 INFO exited: write (exit status 0; not expected)
2017-12-02 00:34:16,270 INFO spawned: 'write' with pid 456
This text goes to the k8s log
2017-12-02 00:34:16,276 INFO exited: write (exit status 0; not expected)
^C2017-12-02 00:34:17,027 WARN received SIGINT indicating exit request
Como dito acima, este é um hack horrível. Existe uma maneira apropriada de dizer ao supervisord para vincular o stdout das crianças à sua própria stdout? (ou seja, diga ao supervisord para não fazer nada e apenas deixe os filhos herdarem os descritores de arquivos normais)
Em uma nota não relacionada, por que o script está sendo reiniciado? Mesmo sem a atribuição explícita dos códigos de saída, o supervisord deve esperar o código de saída de 0.
Tags docker kubernetes supervisord