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

使用Docker后本地代码修改无法在页面生效的问题

问题解决:Docker中Rails代码修改后页面未同步更新

问题说明

我是Docker新手,刚完成Docker安装以及应用与数据库的同步配置,能正常访问http://localhost:3000/。但在VS Code中修改代码后,页面并未同步显示修改内容。

当前配置文件

docker-compose.yml

version: '3'

services:
  postgres:
    image: 'postgres:9.4.5'
    environment:
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'postgres'
    ports:
      - '5432:5432'
    volumes:
      - 'postgres:/var/lib/postgresql/data'
  redis:
    image: 'redis:5.0.8'
    volumes:
      - 'redis:/data'
    ports:
        - '6379:6379'

  [MY_APP_NAME]:
    build: '.'
    depends_on:
      - 'postgres'
      - 'redis'
    volumes:
      - .:/app
    env_file:
      - '.env'
    ports:
      - '3000:3000'
  sidekiq:
    build: '.'
    depends_on:
      - 'postgres'
      - 'redis'
    volumes:
      - '.:/app'
    env_file:
      - '.env'
    command: bundle exec sidekiq -C config/sidekiq.yml
volumes:
  postgres: {}
  redis: {}

Dockerfile

FROM ruby:2.6.6-slim

ARG SECRET_KEY_BASE

RUN apt-get update -qq && apt-get install -qq -y \
  build-essential nodejs libpq-dev git --fix-missing --no-install-recommends && gem install bundler -v 2.3.22

ENV APP_HOME /myapp
RUN mkdir $APP_HOME
WORKDIR $APP_HOME

ADD Gemfile* $APP_HOME/
RUN bundle install -j4

ADD . $APP_HOME

RUN bundle exec rake assets:precompile SECRET_KEY_BASE=${SECRET_KEY_BASE}.to_s AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}, RAILS_ENV=production

VOLUME ["/app/public"]

CMD bundle exec puma -C config/puma.rb

已尝试的配置

在config/environments/development.rb中添加以下内容,但问题未解决:

config.file_watcher = ActiveSupport::FileUpdateChecker
config.cache_classes = false

解决步骤

1. 修正卷映射与工作目录不匹配问题

Dockerfile中工作目录设为/myapp,但docker-compose.yml将本地目录挂载到/app,路径不匹配导致容器读取的是镜像内的旧代码,而非本地修改后的文件。

  • 修改docker-compose.yml中应用服务的卷映射:
    volumes:
      - .:/myapp
    
  • 同步修改Dockerfile中的VOLUME指令:
    VOLUME ["/myapp/public"]
    

2. 强制Rails以开发模式运行

当前Dockerfile执行了生产环境的资产预编译,且启动命令未指定环境,容器默认以生产模式运行——该模式下Rails会缓存代码和资产,不会自动更新。

  • 在.env文件中添加:
    RAILS_ENV=development
    
  • 或直接在docker-compose.yml的应用服务中添加环境变量:
    environment:
      - RAILS_ENV=development
    

3. 开启Puma代码热重载

确保config/puma.rb中启用开发模式的热重载:

if ENV['RAILS_ENV'] == 'development'
  plugin :tmp_restart
end

4. 重启容器生效配置

修改完成后,执行以下命令重启服务:

docker-compose down && docker-compose up --build

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:01:42