Docker容器中NGINX无法与Google Cloud Storage FUSE共存问题
解决NGINX RTMP与gcsfuse在Docker容器中共存的问题
问题根源
你的核心问题是Docker容器默认只会运行CMD指定的前台进程:原tiangolo/nginx-rtmp镜像的CMD是启动NGINX,但你现在把CMD替换成了启动gcsfuse,导致NGINX根本没有启动,自然无法访问RTMP和HTTP服务。
方案一:用启动脚本同时启动两者(推荐)
这种方式无需额外安装服务管理工具,操作简单直接:
- 在
live-stream目录下创建启动脚本start.sh:
#!/bin/bash # 后台挂载gcsfuse(去掉--foreground参数让它在后台运行) sudo gcsfuse --key-file /service-account-key.json "****" /ls_media # 启动NGINX并保持前台运行(确保容器不会退出) nginx -g "daemon off;"
- 修改
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"]
- 验证操作:
重新构建镜像并启动容器,访问localhost:8080确认NGINX正常,进入容器执行df -h检查/ls_media是否成功挂载。
方案二:用Supervisor管理多进程(更稳定)
如果需要更可靠的进程监控与重启机制,可以使用Supervisor:
- 在Dockerfile中添加Supervisor安装命令:
# 在原有安装命令后添加 RUN apt-get install -y supervisor
- 在
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
- 修改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
相关产品推荐
相关产品推荐

