RoR Docker镜像部署至Azure后出现localhost:35729连接失败错误
解决方案
问题根源
35729是rack-livereload的默认livereload服务端口,你的部署环境中没有启动对应的livereload服务,但应用代码仍在尝试连接这个端口,导致Errno::EADDRNOTAVAIL错误。本地正常是因为开发环境下通常会自动启动livereload服务,而Azure部署的容器中缺少这个服务进程。
具体修复步骤
1. 确认Gemfile中rack-livereload仅在开发环境加载
检查你的Gemfile,确保rack-livereload被正确限定在development分组内,这样生产/部署环境不会加载该gem:
group :development do gem 'rack-livereload' # 其他开发环境依赖... end
调整后重新构建Docker镜像,部署环境就不会加载这个gem,自然不会触发端口连接逻辑。
2. 强制在部署环境禁用rack-livereload中间件
如果因为代码依赖无法移除rack-livereload的开发环境分组,可在部署环境的配置文件中直接删除对应的中间件:
打开config/environments/production.rb(或你部署使用的环境配置文件),添加以下配置:
Rails.application.configure do # 其他现有配置... # 移除rack-livereload中间件 config.middleware.delete Rack::LiveReload end
3. 确保部署时使用正确的RAILS_ENV
在Docker启动命令或Dockerfile中明确设置生产环境变量,避免应用以开发环境模式运行:
- 在Dockerfile中添加:
ENV RAILS_ENV production - 或在Azure容器启动参数中设置环境变量:
RAILS_ENV=production
4. 关于EXPOSE指令的说明
EXPOSE 35729仅作为Docker镜像的文档说明,不会自动启动端口对应的服务,也无法解决容器内部连接不存在服务的问题,所以之前的尝试无效是正常的。
内容的提问来源于stack exchange,提问作者CWarrington
相关产品推荐
相关产品推荐

