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 registre em um arquivo e continuamente tail -f
it.
Felizmente, tail
pode aceitar --pid PID
: sairá quando o processo especificado sair. Colocamos $$
lá: PID do shell atual.
Como etapa final, o aplicativo lançado é exec
'ed, o que significa que o shell atual foi completamente substituído por esse aplicativo.
O script do corredor, run.sh
, ficará assim:
#! /usr/bin/env bash
set -eu
rm -rf /var/log/my-application.log
tail --pid $$ -F /var/log/my-application.log &
exec /path/to/my-application --logfile /var/log/my-application.log
OBSERVAÇÃO: usando tail -F
, listamos nomes de arquivos, e eles serão lidos mesmo que apareçam depois!
Finalmente, o Dockerfile minimalista:
FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']
Nota: para trabalhar com algum comportamento tail -f
extremamente estranho (que diz "foi substituído por um arquivo remoto. Desistindo deste nome") eu tentei outra abordagem: todos os arquivos de log conhecidos são criados & truncado no início: dessa forma eu garanto que eles existem, e só então - siga-os:
#! /usr/bin/env bash
set -eu
LOGS=/var/log/myapp/
( umask 0 && truncate -s0 $LOGS/http.{access,error}.log )
tail --pid $$ -n0 -F $LOGS/* &
exec /usr/sbin/apache2 -DFOREGROUND