AWS日志驱动程序未从Docker映像"stdout"中提取"tail-f"



我有一个使用Fargate部署的Alpine Docker映像。这是它运行的命令:

crond -d 8 && tail -f /var/log/cron.log

我通过将>> /var/log/cron.log 2>&1附加到cron作业定义来写入该文件。当我运行docker-compose up时,我会在Docker的输出中看到所有日志,所以我知道日志记录在容器中工作。

我在我的CloudFormation模板中把它作为容器定义的一部分:

LogConfiguration:
LogDriver: awslogs
Options:
awslogs-region: "us-east-1"
awslogs-group: !Ref AvRcloneLogGroup
awslogs-stream-prefix: "av-rclone"

当我尝试Docker命令时,我通过在前台运行crond并将调试日志添加到stdout,将一些日志添加到CloudWatch中,所以我知道AWS日志驱动程序正在工作。

但是,当我尝试切换到tail -f以将作业日志输出到日志驱动程序时,控制台中没有显示任何内容。

如何让AWS日志驱动程序获取这些日志?

在这个类似问题的答案的帮助下,我找到了一个解决方案,尽管我仍然不确定tail -f为什么不适合我。

为了确保Fargate使用虚拟终端实例化图像,我在CloudFormation模板中的TaskDefinition中向ContainerDefinition添加了此行:

PseudoTerminal: true

然后我将DockerfileCMD更改为:

CMD tty; crond -f

-f选项告诉crond在前台运行,防止图像过早退出。

包括tty并不是严格必要的,但我是如何找到虚拟终端的文件名的。在我的案例中,输出是这样的:

/dev/pts/0

我没有将cron作业的输出附加到日志文件中,而是将其重定向到虚拟终端,方法是将其附加到每个作业定义的末尾:

> /dev/pts/0 2>&1

就是这样。现在,我的作业输出通过管道传输到虚拟终端,它最终在我的CloudWatch组中。

最新更新