В іншому запитанні " Убити дочірній процес", коли батько виходить , я отримав відповідь, яка допомогла розібратися в цьому.
Таким чином, ми налаштовуємо додаток таким чином, щоб він реєструвався у файлі та постійно працював у tail -f
ньому. На щастя, tail
можна прийняти --pid PID
: він закриється, коли зазначений процес завершиться. Поміщаємо $$
туди: PID поточної оболонки.
На завершальному етапі запущена програма exec
'ed, що означає, що поточна оболонка повністю замінена на цю програму.
Сценарій Runner,, run.sh
виглядатиме так:
#! /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
ПРИМІТКА: за допомогою tail -F
списку ми називаємо імена файлів, і вони прочитають їх, навіть якщо вони з’являться пізніше!
Нарешті, мінімалістичний Dockerfile:
FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']
Примітка: щоб вирішити надзвичайно дивну tail -f
поведінку (яка говорить, що "була замінена віддаленим файлом. Відмова від цього імені") я спробував інший підхід: всі відомі файли журналів створюються та обрізаються при запуску: таким чином я переконуюсь, що вони існують , і лише потім - хвости їх:
#! /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