首页 > 解决方案 > AWS Fargate Docker - 如何从无头 ubuntu docker 打印和查看 stdout/stderr?

问题描述

这可能是一种 101 问题,但在第一次设置这个问题时,没有任何关于这样一个基本和常见任务的提示。基本上,我有一个无头 ubuntu 作为 AWS 内部的 docker 镜像运行,它是通过 github 操作 CI/CD 构建的。一切运行良好。

在 ubuntu 中,我有一些 python 脚本,比如说一个自定义服务器、cron 作业、一些正在运行的软件等。我怎么能远程知道这些是否记录了任何错误?让我们保持简单:如何从 ubuntu 内部的 python 服务器打印一条错误消息,我可以从外部 docker 读取该消息?AWS 是否有用于查看 stdout/stderr 日志的任何类型的 Web 界面?或者至少是一个 ssh 控制台?有什么例子吗?

此外,我已经使用健康检查设置了我的 docker,以确认我在 ubuntu 中运行的服务器是在线的并且正在运行。这些工作是因为我可以在 localhost 中通过执行docker ps并显示“健康”状态来测试它们。在 AWS 中我如何看到同样的东西?

我真的错过了这么大的事情吗?感觉这应该是在 AWS 上设置 docker 的主页上闪现的第一件事。

标签: pythonamazon-web-servicesdockerloggingamazon-ec2

解决方案


这里有一些东西要解开,你在挖掘了很多你不需要的东西之后才能开始学习,这样你就可以知道如何开始。

  1. 默认情况下,Docker 将记录您描述 dockerfile 设置的启动过程的输出,例如,当您执行ENTRYPOINT bash -C /home/ubuntu/my_dockerfile_sh_scripts/myStartupScripts.sh. 如果这些进程产生的任何子进程也记录到 stdout/stderr,则消息应该冒泡到主机进程,因此会显示在 docker 日志中。如果它们没有冒泡,请在 linux 中查找子进程 stdout/stderr。

  2. 好的,我们知道,但是 AWS 的统计和日志页面到底在哪里?当然是在 Amazon Cloudwatch™ 中。你不是已经知道这个词了吗?为什么,当你创建一个 docker 时,或者在你的 docker 集群旁边的 ECS 控制台上,或者在你正在运行的 docker 镜像服务旁边,它会这样说。等一下!不,不,它没有!任何地方都没有“Cloudwatch”的说法。好吧,有一个页面上有“Cloudwatch”,如果你知道 url,你就可以访问它,但是你看,你实际上并没有看到任何类型的日志来自你的代码在 docker 中的任何地方是的。那么你在哪里看到你的实际日志和输出?在您的服务页面(当前运行的 docker 映像的页面)中有这个 Logs 选项卡:https://eu-central-1.console.aws.amazon.com/ecs/home?region=eu-central-1#/clusters/your-cluster-name/services/your-cluster-docker-image-service/logs. 这个通用命名且未描述的选项卡从 AWS 端显示了不是服务状态的日志,但实际上向您显示了我在第 1 点中提到的 docker 日志。好的。如何将其视为原始文件或通过脚本远程访问?嗯,我不知道。我想您会在阅读几本有关设置 AWS CLI 的手册(您不知道存在的另一件事)之后了解该基本常见任务。

  3. 就像我在第 1 点中所说的那样,docker 无法记录通用操作系统日志消息,或向您显示由您的服务器生成的日志文件,或者只是其他正在运行的软件或作业,这些软件或作业未由您的 dockerfile/config 描述和启动。那么我们如何让 AWS 看到呢?好吧,这有点让人头疼,您必须将 docker 映像的默认操作系统(例如 ubuntu)日志驱动程序替换为sudo yum install -y awslogs设置它,或者您可以在特定日志文件和 stdout/stderr 流之间创建符号链接(docker docs 提到了这一点)。还要检查Mark B 的答案. 但可能最简单的事情是编写您自己的带有短消息的小脚本,这些短消息向主进程打印出事物的状态。通常这就是您所需要的,除非您是企业。

  4. 正在运行的 docker 中是否有任何 ssh 或其他 AWS 在线命令行界面页面,就像您进入 localhost docker 桌面一样?所以你也许可以浏览cdls搜索文件,看看是否一切正常?不,自己做。或者更好的是,首先避免需要它,即使它对研发不方便。

  5. 健康检查。我在哪里看到我的 docker 健康检查?相当于只运行docker ps命令的 localhost 方法。默认情况下,AWS 上的任何地方都没有显示任何运行状况检查。为什么你还需要健康检查?那么如果你的 dockerfile 有HEALTHCHECKs 定义了吗?..您必须在 Fargate™ 中进行设置(..无论 fargate 意味着什么,都会导致名称没有写在任何地方(“UX”))。您必须创建所谓的新任务定义修订版。转到您在 Amazon ECS 中的集群。转到您的集群。然后单击底部服务表的任务定义列中的服务条目。您单击 Create New Revision(新任务定义修订)。在新页面上,单击容器定义表中的容器。在新页面上,您向下滚动到 HEALTHCHECK,宾果游戏!现在这是什么?我在这里粘贴什么命令?它不会自动采用我在 dockerfile 中定义的 HEALTHCHECK,所以这是否意味着我必须在这里写点别的东西?健康检查甚至在什么环境中运行?是我的码头工人吗?是Linux吗?这里' s 答案:您将已在 dockerfile 的 HEALTHCHECK 中写入的内容粘贴到此框中。只需使用http://127.0.0.1(localhost) 就像在本地 docker 桌面测试环境中一样。现在单击更新。单击创建。K,现在我们还没有完成。返回到您的 Amazon ECS/集群/集群。在服务表中单击您的服务名称。单击更新。选择最新版本。选中“强制新部署”。然后继续单击下一步,直到最后单击更新服务。您还可以定义在运行状况检查失败时触发图像关闭的原因。例如,如果它用完了 ram。现在#Amazon,我希望您接受这个答案并将其钉在您糟糕的 ECS 体验中。


我发誓,AWS 和 Azure 等平台的无情、完全自下而上的用户体验是让教程博客行业保持活力的原因。我怎么知道 AWS CloudWatch 是什么,或者它甚至存在?设置时,任何地方都没有关于这些事情的提示。您会认为完成 docker 设置后屏幕上闪现的第一件事是“嘿,现在 99.9% 的人需要设置日志记录。您应该使用 cloudwatch。这就是您如何将运行状况检查连接到 cloudwatch”。但是不,当然不是..!

取而代之的是,AWS 的“工程师”方法似乎是:墙上有一个孔网格,旁边是桶里一堆乱七八糟的电线。现在为了做你想做的常见经常做的任务,你必须先阅读每个孔的手册,以及桶中每根电线的手册,然后找到你需要的所有孔和电线,并将它们插入正确的顺序(对于正确的顺序,您需要找到一篇博客文章,因为这总是涉及到某种程度的不遵循文档,而且肯定也很神奇)。如果您是企业服务器工程师,我想这被称为“工作保障” :)


推荐阅读