Estou implantando um aplicativo de terceiros em conformidade com o comunicado de 12 fatores e um dos pontos informa que os logs do aplicativo devem ser impressos em stdout / stderr: o software de cluster pode coletá-lo.
No entanto, o aplicativo pode gravar apenas em arquivos ou syslog. Como imprimo esses logs?
Respostas:
Uma receita incrível é dada no Dockerfile nginx :
Simplesmente, o aplicativo pode continuar gravando nele como um arquivo, mas, como resultado, as linhas irão para
stdout
&stderr
!fonte
squid3
, e então ele tem problemas com permissões/dev/stdout
.Em outra pergunta, matar o processo filho quando o pai sai , recebi a resposta que ajudou a resolver isso.
Dessa forma, configuramos o aplicativo para que ele se registre em um arquivo e continuamente
tail -f
. Felizmente,tail
pode aceitar--pid PID
: ele será fechado quando o processo especificado terminar. Colocamos$$
lá: PID do shell atual.Como etapa final, o aplicativo iniciado é
exec
ed, o que significa que o shell atual é completamente substituído por esse aplicativo.O script do corredor,,
run.sh
terá a seguinte aparência:NOTA: ao usar
tail -F
, listamos os nomes de arquivos e eles serão lidos mesmo que apareçam mais tarde!Por fim, o Dockerfile minimalista:
Nota: para solucionar um
tail -f
comportamento extremamente estranho (que diz "foi substituído por um arquivo remoto. Desistindo desse nome"), tentei outra abordagem: todos os arquivos de log conhecidos são criados e truncados na inicialização: dessa maneira, garanto que eles existem e somente então - siga-os:fonte
tail
sem a opção --pid.Para um processo em segundo plano em um contêiner de docker, por exemplo, conectando-me ao exec em / bin / bash, eu pude usar.
Isso envia a saída para o stdout do pid 1, que é o único captador do docker.
fonte
docker logs
oukubectl logs
. Eu tenho um contêiner que agenda tarefas através do crontab que não está sendo executado como PID1.para nginx você pode ter
nginx.conf
apontando/dev/stderr
e/dev/stdout
assime sua
Dockerfile
entrada deve serfonte
root