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

#1楼 票数:1

您如何运行容器?

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

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

#2楼 票数:1 已采纳

Dockerfile文档指出,如果您使用ENTRYPOINT的外壳形式,则CMD被完全忽略。 如果不是,则将以您显示的方式附加CMD

如果这只是日志记录,建议您设置Docker日志记录驱动程序,而不是尝试在容器内部配置日志记录。 这简化了映像设置(它仅需要应用程序,而不是每个可能的日志目标)。 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

  ask by MrCholo translate from so

未解决问题?本站智能推荐:

2回复

将ARG传递给ENTRYPOINT

说我在Dockerfile中有这个: 我在上面建立上面的地方: 有没有办法做类似的事情: 我猜这个参数也可以通过docker run传递,而不是在docker build阶段传递?
1回复

将文件传递给dockerrun的最佳方法

我需要做一个docker镜像来处理文件中的数据。 如何在运行时制作图像来处理文件? 谢谢
2回复

如何为基本映像覆盖/发现CMD/ENTRYPOINT

说我有这个: 如果我不使用CMD将CMD默认为基本图像中设置的值? 我对ENTRYPOINT使用ENTRYPOINT覆盖基本映像中的ENTRYPOINT ? 我对CMD使用会否覆盖基本映像中的CMD ? 基本上,我的目标是覆盖基本映像的ENTRYPOINT,但能够发现/重用CMD,这
1回复

Dockerfile中的CMD后跟ENTRYPOINT的问题

我有一个看起来像这样的 Dockerfile: 我想要实现的是使用参数运行 geth 然后运行 ​​nodejs app watcher.js 使用命令正确构建容器镜像: 它使用以下命令正确启动: 但是当我docker exec -it containerID sh并运行 ps 我得到: 看起来它在
1回复

如何动态地将参数传递给dockerrun命令

我有一个这样的docker文件,我必须将参数动态传递给docker run命令 而我的supervisor.conf是这个 我必须将参数传递给“ docker run”命令,因此在docker容器出现时,内部一个位于脚本位置下的脚本应使用该参数。 请让我知道我该怎么做以及如何实现”这
3回复

DOCKER如何在使用Windows映像的dockerrun上设置密码和用户名?

我想要的是我想在启动容器时设置用户名和密码,例如: 我有什么目前用户和密码已硬编码在我的 dockerfile 中: 我试过的我已经听说过环境变量,但这(在 dockerfile 中)对我不起作用: docker build 结果:
1回复

如何使用ENTRYPOINT或CMD从docker进程捕获stdout并将其管道传输到另一个

我有这个: 但这似乎不起作用,可能是因为tee没有安装在我的容器中。 这是正确的方法吗? 我想在ECS上运行容器,将stdout / stderr从节点进程发送到容器stdout / stderr,但还要捕获它。 例如,我尝试这样做: 并没有按预期工作。 但是,这似乎确实可行:
1回复

$cat文件命令在作为环境文件传递给Docker运行命令时不起作用

我有一个非常大的文件,需要作为环境变量传递给 linux ec2 平台中的 Docker 运行命令。 我理想的 docker 命令如下所示: 我得到 /bin/docker :参数列表太长因此,我没有执行上述操作,而是从文件 kafdrop-properties 文件中传递了所有 Env 变量,如下