【问题标题】:AWS Fargate Docker - How to print and see stdout/stderr from a headless ubuntu docker?AWS Fargate Docker - 如何从无头 ubuntu docker 打印和查看 stdout/stderr?
【发布时间】:2022-04-03 01:01:02
【问题描述】:

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

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

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

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

【问题讨论】:

标签: python amazon-web-services docker logging amazon-ec2


【解决方案1】:

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

  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”的说法。好吧,这个one page 上面有“Cloudwatch”,如果你知道 url,你可以访问它,但是你看,你实际上看不到任何来自 docker 代码的任何类型的日志有所以..是的。那么你在哪里看到你的实际日志和输出?在您的服务页面(当前运行的 docker 映像的页面)中有这个日志选项卡: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 看到呢?好吧,这有点让人头疼,您必须用sudo yum install -y awslogsset that up 替换docker 映像的默认操作系统(例如ubuntu)日志驱动程序,或者您可以在特定日志文件和标准输出之间创建符号链接/stderr 流 (docker docs mention of this)。另请检查Mark B's answer。但可能最简单的事情是编写您自己的带有短消息的小脚本,这些短消息向主进程打印出事物的状态。通常这就是您所需要的,除非您是企业。

  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吗?答案是这样的:你在这个框中粘贴你已经在你的 dockerfile 的 HEALTHCHECK 中写的内容。只需像在本地 docker 桌面测试环境中一样使用 http://127.0.0.1 (localhost)。现在单击更新。单击创建。 K,现在我们还没有完成。返回到您的 Amazon ECS/集群/集群。在服务表中单击您的服务名称。单击更新。选择最新版本。选中“强制新部署”。然后继续单击下一步,直到最后单击更新服务。您还可以定义在运行状况检查失败时触发图像关闭的原因。例如,如果它用完了 ram。现在#Amazon,我希望你接受这个答案并将其钉在你糟糕的 ECS 体验中。


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

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

【讨论】:

  • 这太棒了,谢谢! (如果你有博客我会读的)
【解决方案2】:

第 1 步。 通过删除您关心的所有日志文件并用指向 stdout 或 stderr 的符号链接替换它们来更新您的 docker 映像,例如在我可能会做的 nginx 容器中捕获日志以下在Dockerfile

RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

第 2 步。 在 ECS 任务定义中配置 the awslogs driver,如下所示:

      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "my-log-group",
          "awslogs-region": "my-aws-region",
          "awslogs-stream-prefix": "my-log-prefix"
        }
      }

只要您授予 ECS 执行角色写入 AWS 日志的权限,日志数据就会开始出现在 CloudWatch Logs 中。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,我发现AWS Wiki/dev/stdout 符号链接对我不起作用,但 /proc/1/fd/1 符号链接对我有用。

    解决办法如下:

    第 1 步。将这些命令添加到您的 Dockerfile。

    # forward logs to docker log collector
    RUN ln -sf /proc/1/fd/1 /var/log/console.log \
        && ln -sf /proc/1/fd/2 /var/log/error.log
    

    第二步,参考“Mark B”的第二步。

    【讨论】:

      猜你喜欢
      • 2017-10-30
      • 2019-12-11
      • 2019-11-22
      • 2021-04-11
      • 2021-05-07
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多