无法将日志文件拖到 Ubuntu 容器中的 docker 日志中

无法将日志文件拖到 Ubuntu 容器中的 docker 日志中

这是一个类似的问题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:latestubuntu: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

coreutilsUbuntu 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 以适应重命名、删除和创建的方式跟踪命名文件。

相关内容