【问题标题】:How do I display output from Python application running inside Docker container?如何显示在 Docker 容器中运行的 Python 应用程序的输出?
【发布时间】:2014-12-04 18:37:44
【问题描述】:

所以,我在 Docker 容器中运行了一些 Python 代码。我使用 Google 的 gcloud 脚本启动了本地环境。我看到了基本的访问样式日志和运行状况检查信息,但我不确定如何将我正在从 Python 应用程序写入的日志消息传递到控制台。是否可以设置一个参数来使用我的 gcloud 脚本来完成此操作,或者我可以在 Dockerfile 中设置什么可以提供帮助?

【问题讨论】:

  • 您可以attach自己到正在运行的容器,也可以使用docker logs。您也可以在使用docker run -a 启动容器时附加自己。我希望这些信息对您有所帮助。
  • 分享Dockerfile 以获得更多支持。现在容器内的日志在哪里?通常将日志打印到容器内的控制台(stdout/stderr),然后您可以在外部使用docker logs。您可以随时使用docker exec 命令跳转到里面查看普通应用程序的日志
  • 感谢各位的帮助。 “码头日志”是我正在寻找的。我认为我缺少的部分是如何获取正在运行的 docker 进程 ID(docker ps),因此我可以将其提供给 logs 命令。如果你们中的任何一个能写出你的答案,我会标记为正确的。

标签: docker boot2docker gcloud dockerfile


【解决方案1】:

为了让 Python 登录您的终端/命令行/控制台,当从 docker 容器执行时,您应该在 docker-compose.yml 中设置此变量

  environment:
    - PYTHONUNBUFFERED=0

如果您使用print 进行调试,这也是一个有效的解决方案。

【讨论】:

  • 让我开心。谢谢。
  • 很高兴能帮上忙 :)
  • 我正在使用 docker-compose,其中一个容器正在运行 Django。尽管正在打印来自“mange.py runserver”的消息(所有 GET 和 POST 请求都已显示),但在我添加此环境变量之前,我的打印消息并未显示。谢谢!!
  • 谢谢,非常有帮助。您可能会认为,当您运行 docker-compose up 时,它会默认具有与您的代码生成器 pre-Dockerize 相同的输出,但也许我遗漏了一些东西。
  • - PYTHONUNBUFFERED=1
【解决方案2】:

(根据cmets回答)

如果您将应用程序包装到 docker-compose 中,则无需知道容器 ID。只需在您的Dockerfile 旁边添加docker-compose.yml。这听起来像是额外的间接层级,但对于一个简单的应用程序来说,它就像这样微不足道:

version: "3.3"

services:
  build: .
  python_app:
    environment:
      - PYTHONUNBUFFERED=1

就是这样。拥有它的好处是您不需要传递 docker 需要的大量标志,因为它们是自动添加的。如果以后需要它们,它还可以简化对卷和环境变量的处理。

您可以按服务名称查看日志:

docker-compose logs python_app

顺便说一句,如果我在本地测试某些东西,我宁愿设置PYTHONUNBUFFERED=1。它禁用了缓冲,这使得本地日志记录更具确定性。我遇到了很多日志记录问题,例如,当我尝试在我的 python 应用程序中启动 grpc 服务器时,因为在服务器启动之前刷新的日志并不是我想要查看的所有 init 日志。一旦服务器启动,您将看不到初始化日志,因为日志重新附加到不同/衍生的进程。

【讨论】:

    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多