Я развертываю стороннее приложение в соответствии с рекомендациями по 12 факторам , и один из моментов говорит о том, что журналы приложений должны быть напечатаны в stdout / stderr: тогда программное обеспечение для кластеризации может их собрать.
Тем не менее, приложение может записывать только файлы или системный журнал. Как мне распечатать эти журналы вместо этого?
Ответы:
Удивительный рецепт дается в Dockerfile nginx :
Просто приложение может продолжать запись в него в виде файла, но в результате строки будут идти в
stdout
&stderr
!источник
squid3
, а затем возникают проблемы с разрешениями на/dev/stdout
.В другом вопросе « Убить дочерний процесс при выходе из родительского процесса» я получил ответ, который помог разобраться в этом.
Таким образом, мы настраиваем приложение таким образом, чтобы оно регистрировалось в файл и непрерывно
tail -f
его. К счастью,tail
может принять--pid PID
: он выйдет при выходе из указанного процесса. Мы помещаем$$
туда: PID текущей оболочки.В качестве последнего шага запущенное приложение
exec
редактируется, что означает, что текущая оболочка полностью заменена этим приложением.Скрипт бегуна
run.sh
, будет выглядеть так:ПРИМЕЧАНИЕ: используя
tail -F
список имен файлов, он будет читать их, даже если они появятся позже!Наконец, минималистичный Dockerfile:
Примечание: для работы с очень странным
tail -f
поведением (которое говорит «был заменен удаленным файлом. Отказывается от этого имени»), я попробовал другой подход: все известные файлы журналов создаются и усекаются при запуске: таким образом, я гарантирую, что они существуют и только потом - хвост им:источник
tail
без опции --pid.Для фонового процесса в Docker-контейнере, например, соединение с exec в / bin / bash, которое я смог использовать.
Это отправляет вывод на стандартный вывод pid 1, который является одним из подключаемых докеров.
источник
docker logs
илиkubectl logs
. У меня есть контейнер, который планирует задачу через crontab, который не работает как PID1.для Nginx вы можете
nginx.conf
указывать/dev/stderr
и/dev/stdout
нравится этои ваша
Dockerfile
запись должна бытьисточник
root