Estou implantando um aplicativo de terceiros em conformidade com o 12 factor advisory, e um dos pontos diz que os logs do aplicativo devem ser impressos em stdout / stderr: então o software de cluster pode coletá-lo.
No entanto, o aplicativo só pode gravar em arquivos ou syslog. Como faço para imprimir esses logs?
Dessa forma, configuramos o aplicativo para que ele faça logon em um arquivo e continuamente tail -f ele. Felizmente, tail pode aceitar --pid PID: ele sairá quando o processo especificado sair. Nós colocamos $$ lá: PID do shell atual.
Como etapa final, o aplicativo lançado é exec"ed, O que significa que o shell atual é completamente substituído por esse aplicativo.
Nota: usando tail -F listamos nomes de arquivos, e ele os lerá mesmo que apareçam mais tarde!
Finalmente, o Dockerfile minimalista:
FROM ubuntuADD run.sh /root/run.shCMD ['/root/run.sh']
Nota: para workaroung alguns extremamente estranho tail -f comportamento (que diz "foi substituído por um arquivo remoto. desistindo deste nome") tentei outra abordagem: todos os arquivos de log conhecidos são criados & amp; truncado no arranque: desta forma eu garantir que eles existem, e só então-cauda-los:
Eu só tive que resolver este problema com apache2, e lutou com o uso CustomLog para tentar redirecionar para /proc/1/fd/1 mas não consegui fazer isso funcionar. Na minha implementação, o apache não estava sendo executado como pid 1, entao a resposta de kolypto não funcionou como está. Abordagem de Pieter parecia atraente, então eu fundi os dois e o resultado funciona maravilhosamente:
Tecnicamente, isso mantém o apache access.log e error.log pretender stdout e stderr no que diz respeito ao coletor de log do docker, mas seria ótimo se houvesse uma maneira de separar os dois fora o recipiente, como um interruptor para docker logs isso mostraria apenas um ou outro...