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:
#! /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
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:
FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']
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:
#! /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