Невозможно связать файл журнала с журналами докеров в контейнере Ubuntu

Это проблема, аналогичная проблеме « tail -f не следует за файлом журнала в контейнере Docker », но я не уверен, что это та же основная причина.

Я пытаюсь настроить простой контейнер cron docker и тестировал кучу примеров, которые могу найти, включая этот " https://stackoverflow.com /questions/37458287/how-to-run-a-cron-job-inside-a-docker-container.

FROM ubuntu:latest

# Setup cron and scripts...
...

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Run the command on container startup
CMD cron && tail -f /var/log/cron.log

Проблема в том, что это работает и запускаются задания cron, но при запуске docker run ничего не отображается в журналах или выходных данных докера. И да, я убедился, что файл журнала записывается, выполнив команду docker exec в контейнере.


Затем я протестировал переход с ubuntu: latest на ] ubuntu: trusty , думая, что это может иметь какое-то отношение к Ubuntu 16. Это привело к следующей ошибке при запуске контейнера:

tail: unrecognized file system type 0x794c7630 for '/var/log/cron.log'. please report this to bug-coreutils@gnu.org. reverting to polling

После поиска этой ошибки я нашел несколько предложений. Итак, я попытался настроить свой файл докеров следующим образом:

# RUN touch /var/log/cron.log   <-- remove this
CMD touch /var/log/cron.log && cron && tail -f /var/log/cron.log

Теперь, когда я запускаю это с ubuntu: latest , он работает нормально. Что именно здесь происходит?

3
задан 2 August 2017 в 18:11
1 ответ

Сообщение, которое вы видите из tail , является предупреждением (а не ошибкой). Это означает, что tail не распознал файловую систему, которая в данном случае является overlayfs, настроенным докером.

Вы можете проверить тип файловой системы с помощью команды stat (1) , например:

# in docker
root@6296bdc3efad:/# stat -f -c %t /
794c7630
# on a plain ext4 filesystem
$ stat -f -c %t /
ef53

Версия coreutils (которая включает tail ) в Ubuntu 14.04 (надежный) не распознает overlayfs , отсюда и предупреждение. Версия в Ubuntu 18.04 (bionic) распознает это нормально, поэтому предупреждения нет.

Это предупреждение не является причиной вашей проблемы, заключающейся в том, что сообщения журнала отображаются не так, как вы ожидали. Это вызвано тем, что tail просматривает файл, отличный от того, в который записывает системный журнал.Вы можете решить эту проблему, используя tail -F (заглавная F ) или tail --follow = name (оба эквивалентны).

Из tail (1) :

С --follow (-f) хвост по умолчанию следует за файловым дескриптором, что означает, что даже если хвостовой файл переименован, tail будет продолжать отслеживать все кончено. Такое поведение по умолчанию нежелательно, если вы действительно хотите отслеживать фактическое имя файла, а не дескриптор файла (например, ротацию журнала). В этом случае используйте --follow = name. Это заставляет tail отслеживать именованный файл таким образом, чтобы обеспечить переименование, удаление и создание.

1
ответ дан 3 December 2019 в 07:22

Теги

Похожие вопросы