You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker Nginx-RTMP的entrypoint.sh中处理$name变量?

问题分析与解决方案

你当前的写法大概率不可行,原因在于envsubst的执行时机和变量作用域问题:

  • 原entrypoint.sh里的$name是在容器启动阶段由envsubst处理的,但此时还没有实际的流推送事件,$name在entrypoint的环境中是空值,无法被正确赋值给new_stream_name。
  • 而nginx配置里的$name是Nginx运行时(当有流推送进来时)才会被替换为实际流名称的变量,这个变量无法在entrypoint.sh的容器启动阶段被捕获和处理。

正确实现方案

你需要把自定义处理逻辑抽成独立的脚本,让Nginx在触发exec_push时调用这个脚本,并将$name作为参数传递进去,具体步骤如下:

  • 创建自定义处理脚本
    在容器内(或挂载到容器的目录)创建一个脚本,比如/app/process_stream.sh,内容示例:
#!/bin/bash
# 接收Nginx传过来的流名称参数
new_stream_name="$1"

# 这里写你的自定义处理逻辑,比如重命名、记录日志、调用其他服务等
echo "处理流:$new_stream_name" >> /var/log/stream_process.log
# 示例:如果需要转推到其他地址,可以在这里执行ffmpeg命令
# ffmpeg -i rtmp://localhost/live/$new_stream_name -c copy rtmp://other-server/live/processed_$new_stream_name

给脚本添加执行权限:chmod +x /app/process_stream.sh

  • 修改entrypoint.sh中的EXECPUSH变量
    把原EXECPUSH从直接包含处理逻辑,改为调用这个脚本,并传递$name参数:
# 原EXECPUSH可能类似这样:
# EXECPUSH="exec ffmpeg ... \$name"
# 修改为:
EXECPUSH="exec /app/process_stream.sh \$name"

注意这里要给$name加反斜杠转义,避免envsubst在生成nginx.conf时把它替换成空值,让Nginx运行时能正确解析这个变量。

  • 确保脚本被正确挂载或打包进镜像
    • 如果是用挂载方式,在docker run或docker-compose中把本地的process_stream.sh挂载到容器的/app/process_stream.sh。
    • 如果是构建自定义镜像,在Dockerfile中添加复制脚本的步骤:
FROM alfg/nginx-rtmp
COPY process_stream.sh /app/
RUN chmod +x /app/process_stream.sh

这样,当有流推送到Nginx时,exec_push会触发process_stream.sh脚本,并将实际的流名称作为参数传入,脚本里就能拿到new_stream_name并执行自定义处理了。

内容的提问来源于stack exchange,提问作者Earthling

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:24:57