Это проблема, аналогичная проблеме « 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
, он работает нормально. Что именно здесь происходит?
Сообщение, которое вы видите из 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 отслеживать именованный файл таким образом, чтобы обеспечить переименование, удаление и создание.