我有一个使用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组中。