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

Docker容器中NGINX无法与Google Cloud Storage FUSE共存问题

解决NGINX RTMP与gcsfuse在Docker容器中共存的问题

问题根源

你的核心问题是Docker容器默认只会运行CMD指定的前台进程:原tiangolo/nginx-rtmp镜像的CMD是启动NGINX,但你现在把CMD替换成了启动gcsfuse,导致NGINX根本没有启动,自然无法访问RTMP和HTTP服务。


方案一:用启动脚本同时启动两者(推荐)

这种方式无需额外安装服务管理工具,操作简单直接:

  1. 在live-stream目录下创建启动脚本start.sh:
#!/bin/bash
# 后台挂载gcsfuse(去掉--foreground参数让它在后台运行)
sudo gcsfuse --key-file /service-account-key.json "****" /ls_media
# 启动NGINX并保持前台运行(确保容器不会退出)
nginx -g "daemon off;"
  1. 修改live-stream目录下的Dockerfile,替换原CMD为启动脚本:
FROM tiangolo/nginx-rtmp

RUN apt-get update \
&& apt-get install -y sudo

COPY index.html /www/
COPY service-account-key.json .
# 复制启动脚本到容器并添加执行权限
COPY start.sh /start.sh
RUN chmod +x /start.sh

ENV GCSFUSE_REPO gcsfuse-buster
RUN echo $GCSFUSE_REPO
RUN echo "deb https://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
RUN sudo apt-get update -y
RUN sudo apt-get install fuse gcsfuse -y

RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg && sudo apt-get update -y && sudo apt-get install google-cloud-sdk -y

RUN sudo gcloud auth activate-service-account --key-file=/service-account-key.json
ENV GOOGLE_APPLICATION_CREDENTIALS "/service-account-key.json"
RUN mkdir /ls_media

# 替换原CMD为启动脚本
CMD ["/start.sh"]
  1. 验证操作:
    重新构建镜像并启动容器,访问localhost:8080确认NGINX正常,进入容器执行df -h检查/ls_media是否成功挂载。

方案二:用Supervisor管理多进程(更稳定)

如果需要更可靠的进程监控与重启机制,可以使用Supervisor:

  1. 在Dockerfile中添加Supervisor安装命令:
# 在原有安装命令后添加
RUN apt-get install -y supervisor
  1. 在live-stream目录下创建supervisord.conf配置文件:
[supervisord]
nodaemon=true

[program:nginx]
command=nginx -g "daemon off;"
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:gcsfuse]
command=sudo gcsfuse --key-file /service-account-key.json "****" /ls_media
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
  1. 修改Dockerfile的CMD为启动Supervisor:
# 复制配置文件到容器指定目录
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 替换CMD
CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:35:21