【问题标题】:How bad is it to pipe process to consumer in ENTRYPOINT?在 ENTRYPOINT 中将流程传递给消费者有多糟糕?
【发布时间】:2019-09-19 07:42:51
【问题描述】:

在 Dockerfile 中使用这样的东西会有多糟糕:

ENTRYPOINT node . | tee >(send_logs_to_elastic_search)

大多数日志记录解决方案都需要一些非常讨厌的配置。以上将是我们以编程方式捕获日志并编写我们自己的胶水代码的一种方式。

上述解决方案的主要问题是CMD 参数不会附加到node 进程?我假设他们会被追加到tee 进程中吗?像这样:

docker run foo --arg1 --arg2

我假设它看起来像:

node . | tee >(send_logs_to_elastic_search) --arg1 --arg2

有人知道吗?

另一个潜在的问题是您的容器的可配置性较低,它被“硬编码”以将日志发送到send_logs_to_elastic_search 进程。

【问题讨论】:

    标签: docker amazon-ecs docker-run


    【解决方案1】:

    The Dockerfile documentation 表示如果您使用ENTRYPOINT 的shell 形式,那么CMD 将被完全忽略。如果不是,那么CMD 将按照您显示的方式附加。

    如果这只是关于日志记录,我建议 setting up a Docker logging driver 尝试在容器内配置日志记录。这简化了您的图像设置(它只需要应用程序而不是每个可能的日志目标)。 logstashfluentd 都是用于移动日志消息的流行工具。

    如果您正在查看更复杂的脚本,我几乎总是会将其写入独立的 shell 脚本,而不是尝试将其直接写入 Dockerfile。

    ...
    COPY docker-entrypoint.sh /
    RUN chmod +x /docker-entrypoint.sh
    ENTRYPOINT ["/docker-entrypoint.sh"]
    CMD ["node", "."]
    

    入口点脚本将接收命令部分作为命令行参数。通常,它会以exec "$@" 结尾来运行该命令。如果您愿意让 shell 包装器成为主容器进程,您可以将命令的输出通过管道传输到某处

    #!/bin/sh
    "$@" | send_logs_to_elasticsearch
    

    【讨论】:

      【解决方案2】:

      您如何运行您的容器?

      通常您可以将 filebeats 或其他东西直接连接到 /var/lib/docker/containers/*/*.json.log 并让主机发送所有容器的所有日志

      这是filebeats 的教程,很好,因为他们可以进行卷挂载并使用另一个容器进行日志提取

      【讨论】:

      • 看到这对我来说听起来很复杂,但我会阅读链接谢谢
      • Mayb,但它是适用于所有容器的通用解决方案,并且很好地使用了微服务。有一天,您可能会改为使用 splunk,然后将其迁移到一个容器
      猜你喜欢
      • 1970-01-01
      • 2012-12-31
      • 2018-11-27
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      相关资源
      最近更新 更多