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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:17:56