这是一个类似的问题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 日志或输出中没有任何内容出现。是的,我已经通过在容器上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 [email protected]. reverting to polling
在谷歌搜索该错误后,我找到了一些建议。所以我尝试像这样调整我的docker文件:
# RUN touch /var/log/cron.log <-- remove this
CMD touch /var/log/cron.log && cron && tail -f /var/log/cron.log
现在当我运行它时ubuntu:latest
,它似乎工作正常。这里到底发生了什么?
答案1
您看到的消息tail
是警告(不是错误)。这意味着tail
无法识别文件系统,在本例中是 docker 配置的 overlayfs。
您可以使用以下命令检查文件系统类型stat(1)
,例如:
# in docker
root@6296bdc3efad:/# stat -f -c %t /
794c7630
# on a plain ext4 filesystem
$ stat -f -c %t /
ef53
coreutils
Ubuntu 14.04 (trusty) 中的(包括)版本tail
无法识别overlayfs
,因此出现警告。Ubuntu 18.04 (bionic) 中的版本可以很好地识别它,因此没有警告。
此警告不是导致日志消息未按预期显示的问题的原因。这是由于您tail
查看的文件与 syslog 写入的文件不同。您应该能够通过使用tail -F
(大写F
) 或tail --follow=name
(两者等效) 来解决这个问题。
从tail(1)
:
使用 --follow (-f) 时,tail 默认跟踪文件描述符,这意味着即使 tail 文件被重命名,tail 仍会继续跟踪其结尾。当您真正想要跟踪文件的实际名称而不是文件描述符(例如,日志轮换)时,这种默认行为并不理想。在这种情况下,请使用 --follow=name。这会导致 tail 以适应重命名、删除和创建的方式跟踪命名文件。