使用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
相关产品推荐
相关产品推荐

