LINUX.ORG.RU

послать сообщение из контейнера в «docker logs»

 ,


0

1

Здравствуйте!

Имеется контейнер, в котором запущен процесс ссссссс имеющий pid=1. В этом же контейнере есть crond (pid != 1), который запускает раз в сутки команду, которая пишет сообщения на stderr. Хотелось бы stderr команды прочитать по «docker logs». Есть идеи как это сделать?

в контейнере процессы выглядят так

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
pasha        1 12.7  3.0 1084548 982220 ?      Rs   09:03   0:08 ссссссс -F -c /etc/ссссссс.conf
root         8  0.0  0.0   4228  1144 ?        Ss   09:03   0:00 crond -i

Моя идея была написать в кронтабе так:

2 2 * * * date >/proc/1/fd/2

Но у процесса ссссссс нет TTY и следовательно нет stdout и stderr. Как же тогда docker перехватывает stdout и stderr процесса ссссссс?


Ответ на: комментарий от router

Ну и с правильным вопросом гугл первой же строкой выдаёт ответ - /dev/stdout

https://stackoverflow.com/questions/45395390/see-cron-output-via-docker-logs-without-using-an-extra-file

07 2 * * * /data/docker/backup_webserver/backupscript.sh > /dev/stdout
router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

я много крутился вокруг /dev/stdout, но не работает ((

вот так можно проверить. в контейнере запустить команду

docker exec CONTAINER_NAME bash -c 'date > /dev/stdout'

затем посмотреть логи

docker logs CONTAINER_NAME | tail

krpsh
() автор топика
Ответ на: комментарий от krpsh

На мой взгляд, тут вся проблема в том, что процесс с pid=1 не открывает tty, это хорошо видно из первого поста, в котором приведен вывод команды ps в контейнере. Но при этом docker logs этого контейнера пистрит сообщениями от процесса с pid=1.

krpsh
() автор топика

Отвечу сам себе, может кому пригодится )))

Да, дело именно в tty

Для того чтобы из контейнера можно было писать в docker logs от процесса с pid!=1 нужно запустить в контейнере главный процесс через bash -c ‘exec …’ и тогда tty останетcя подключенным и можно будет писать в /proc/1/fd/1 и /proc/1/fd/2.

Но вопрос о том, как docker перехватывает stdout и stderr у главного процесса без tty остается открытым. Подозреваю, что он это делает как-то похоже на systemd, когда она запускает сервис c Type=simple. Возможно, для этого оба (docker и systemd) используют pipe или unix socket.

krpsh
() автор топика