Назад | Перейти на главную страницу

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

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