【问题标题】:Run Prometheus with docker failed when --enable-feature=promql-at-modifier当 --enable-feature=promql-at-modifier 使用 docker 运行 Prometheus 失败
【发布时间】:2021-10-06 03:09:54
【问题描述】:

在 Windows 上 我成功地从这样的 docker 映像运行 Prometheus。

docker run -p 9090:9090 \
-v D:/WORK/MyProject/grafana:/etc/prometheus \
prom/prometheus

D:/WORK/MyProject/grafana 包含 prometheus.yml 文件,其中包含我需要的所有配置。

现在我需要启用@运算符的使用,所以我添加了promql-at-modifier尝试运行

docker run -p 9090:9090 \
-v D:/WORK/MyProject/grafana:/etc/prometheus \
prom/prometheus --enable-feature=promql-at-modifier

我得到了以下信息:

level=info ts=2021-07-30T14:56:29.139Z caller=main.go:143 msg="Experimental promql-at-modifier enabled"
level=error ts=2021-07-30T14:56:29.139Z caller=main.go:356 msg="Error loading config (--config.file=prometheus.yml)" err="open prometheus.yml: no such file or directory"

试图谷歌。有挂载文件的建议

docker run -p 9090:9090 \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

(来自https://www.promlts.com/resources/wheres-my-prometheus-yml) 但没有运气。

尝试指定配置文件选项,但再次失败。

你能帮忙吗?

【问题讨论】:

    标签: docker prometheus


    【解决方案1】:

    你可以尝试添加:

    --config.file=/etc/prometheus/prometheus.yml 
    

    docker run --publish=9090:9090 \
    --volume=D:/WORK/MyProject/grafana:/etc/prometheus \
    prom/prometheus \
      --config.file=/etc/prometheus/prometheus.yml \
      --enable-feature=promql-at-modifier
    

    说明:添加标志后(例如--enable-feature),其他标志采用默认值。 --config.file 的默认值是 prometheus.yml,这不是您想要的(您想要 /etc/prometheus/prometheus.yml),因此您必须明确引用它。

    【讨论】:

    • 帮助!谢谢。
    【解决方案2】:

    DazWilkin 回答背后的一些简短细节:

    如果你 docker inspectprom/prometheus 图片,你会发现 以下:

                "Entrypoint": [
                    "/bin/prometheus"
                ],
                "Cmd": [
                    "--config.file=/etc/prometheus/prometheus.yml",
                    "--storage.tsdb.path=/prometheus",
                    "--web.console.libraries=/usr/share/prometheus/console_libraries",
                    "--web.console.templates=/usr/share/prometheus/consoles"
                ],
    

    当你运行时:

    docker run ... prom/prometheus --enable-feature=promql-at-modifier
    

    您正在替换现有的Cmd 设置,因此该命令实际上 执行的是/bin/prometheus --enable-feature=promql-at-modifier。到 提供与默认情况下相同的行为,您实际上会 想跑:

    docker run ... prom/prometheus \
      --enable-feature=promql-at-modifier \
      --config.file=/etc/prometheus/prometheus.yml \
      --storage.tsdb.path=/prometheus \
      --web.console.libraries=/usr/share/prometheus/console_libraries \
      --web.console.templates=/usr/share/prometheus/consoles
    

    【讨论】:

      【解决方案3】:

      我是 docker 的粉丝,但它确实有一些摩擦点,你找到了其中一个。

      https://github.com/prometheus/prometheus/blob/main/Dockerfile#L25是上游prometheus定义ENTRYPOINTCMD的地方:

      ENTRYPOINT [ "/bin/prometheus" ]
      CMD        [ "--config.file=/etc/prometheus/prometheus.yml", \
                   "--storage.tsdb.path=/prometheus", \
                   "--web.console.libraries=/usr/share/prometheus/console_libraries", \
                   "--web.console.templates=/usr/share/prometheus/consoles" ]
      

      问题是,任何提供给docker run 命令的参数都将替换默认的CMD。因此,为了将参数附加到默认CMD,很遗憾您需要复制上游 CMD,然后将参数添加到列表中。

      遗憾的是,docker 不(目前!)支持任何方式将某些内容“附加”到上游的 CMD。 How to append an argument to a container command? 提供了一种使用环境变量来实现的想法。

      在我想提供默认参数并且允许调用提供额外参数的一般情况下,我通常遵循这种模式:

      • 让入口点启动一个 shell 脚本
      • exec shell 脚本末尾的真正入口点。 exec 用真正的入口点替换 shell,因此 exec 很重要,因此信号被传递到入口点而不是包装器 shell 脚本。
      • 在脚本中exec 的参数末尾,添加"$@",它扩展为shell 脚本的参数,并适当引用(是的,shell 非常深奥!你会认为它会引用所有参数放在一起,但它引用了每个参数,因为那个标记很神奇)

      这样,“默认”命令在 shell 脚本中,因此不需要包含在 CMD 中。这种方法的缺点是,如果您愿意,shell 脚本提供的参数更难以删除。

      这是一个例子:

      https://github.com/farrellit/stackoverflow/tree/main/68593213

      dockerfile 包含一个默认的 CMD:

      FROM alpine
      COPY entrypoint.sh /entrypoint.sh
      ENTRYPOINT ["/entrypoint.sh"]
      CMD ["7"]
      

      entrypoint.sh 包含一组“自动”参数,附加 CMD,默认或覆盖。

      #!/bin/sh
      exec echo 1 2 3 "$@"
      

      Makefile 演示了两个调用:

          docker run --rm stackoverflow-68593213
          docker run --rm stackoverflow-68593213 4 5 6
      
      docker run --rm stackoverflow-68593213
      1 2 3 7
      docker run --rm stackoverflow-68593213 4 5 6
      1 2 3 4 5 6
      

      这里,1 2 3 是我总是想要传递给 ENTRYPOINT 的默认“基本”参数,7 是默认的“附加”参数,4 5 6 提供了覆盖默认参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-24
        • 2019-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        相关资源
        最近更新 更多