0

在 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进程。

4

2 回答 2

2

Dockerfile 文档表明,如果你使用 shell 形式ENTRYPOINTthen 将CMD被完全忽略。如果不是,那么CMD将基本上按照您显示的方式附加。

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

如果您正在查看更复杂的脚本,我几乎总是将其写入独立的 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
于 2019-09-18T23:42:51.837 回答
0

你是如何运行你的容器的?

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

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

于 2019-09-18T23:34:34.167 回答