Docker化Rails生产环境静态资源加载失败:路由匹配错误
解决Docker化Rails生产环境静态资源加载失败问题
核心原因分析
- 静态文件服务未启用:生产环境下Rails默认关闭
public_file_server(由RAILS_SERVE_STATIC_FILES环境变量控制),直接用rails server启动时,Rails不会处理public/assets下的静态资源请求,导致路由匹配失败。 - 资产预编译环境不匹配:Dockerfile执行
rails assets:precompile时未指定生产环境,默认在开发环境编译资源,但运行时是生产环境,两者生成的资源哈希值不一致,导致请求的资源文件实际不存在。
具体修复步骤
1. 开启静态文件服务
推荐用环境变量方式保持配置灵活性:
Docker配置添加环境变量:在
docker-compose.yml的服务配置中加入:environment: - RAILS_SERVE_STATIC_FILES=1 - RAILS_ENV=production或者在入口脚本开头添加:
export RAILS_SERVE_STATIC_FILES=1 export RAILS_ENV=production直接修改生产环境配置(测试场景用):编辑
config/environment/production.rb,将:config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?改为:
config.public_file_server.enabled = true
2. 确保资产预编译在生产环境执行
修改Dockerfile,在预编译前设置生产环境变量:
FROM ruby:slim-bullseye COPY . /app WORKDIR /app # 设置生产环境变量 ENV RAILS_ENV=production RUN apt-get -y update \ && apt-get -y upgrade \ && apt-get install -y \ build-essential make gcc libpq5 libpq-dev nodejs npm \ && npm install -g yarn \ && bundler install \ && yarn \ && rails assets:precompile \ && rails yarn:install \ && ldconfig
3. 验证修复效果
重新构建镜像并启动服务:
docker-compose build docker-compose up
查看production.log,若不再出现ActionController::RoutingError,且页面能加载CSS/JS,说明修复成功。
内容的提问来源于stack exchange,提问作者swiss_knight
相关产品推荐
相关产品推荐

