AWS 日志驱动程序未将 `tail -f` 提取到 Docker 图像 `stdout`

AWS log driver not picking up `tail -f` to Docker image `stdout`

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

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 命令时,我通过 运行ning crond 在前台获得了 CloudWatch 的一些日志,调试日志到 stdout,所以我知道 AWS 日志驱动程序正在工作。

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

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

我在 this answer 的帮助下找到了解决类似问题的方法,但我仍然不确定为什么 tail -f 对我不起作用。

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

PseudoTerminal: true

然后我将 Dockerfile CMD 更改为:

CMD tty; crond -f

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

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

/dev/pts/0

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

> /dev/pts/0 2>&1

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