Docker - Rails Development Auto Reload Broken (Rails 4.2) Mac NFS

Posted

技术标签:

【中文标题】Docker - Rails Development Auto Reload Broken (Rails 4.2) Mac NFS【英文标题】: 【发布时间】:2021-02-20 01:10:47 【问题描述】:

我正在处理一个大型遗留应用程序,我们最近从 3.2 更新到 Rails 4.2。切换后,Docker 容器内的 Rails 不会接收从容器外部所做的更改。重新启动 docker 容器然后获取更改。每次进行更改时重新启动 docker 都会变得很烦人。我到处搜索,发现了这个问题的许多实例,有可能的解决方案,但没有任何效果。从 docker bash shell 中触摸文件确实会触发 Rails 重新加载。文件事件未传递到 docker 容器。

一些失败的努力:

添加config.file_watcher = ActiveSupport::FileUpdateChecker 将 Docker for Mac 更新到当前版本3.1.0

我们在 Catalina 和 Big Sur 都有开发人员,他们都遇到了同样的问题。

docker-compose.yml

  worker: &base
    build: .
    image: myapp/app4
    command: bash -c "source /root/.profile && dockerize -wait tcp://mysql:3306 -wait tcp://redis:6379 -timeout 60s rake jobs:work"
    env_file:
      - ./config/envvars/mysql.env
      - ./config/envvars/ruby.env
      - ./config/envvars/private.env
    volumes:
      - "nfsmount4:/usr/src/app"
      - ./config/mysql_client.cnf:/etc/my.cnf
      - $HOME/.ssh:/root/.ssh
    links:
      - mysql
      - redis

volumes:

  mysql-data4:

  nfsmount4:
    driver: local
    driver_opts:
      type: nfs
      o: addr=host.docker.internal,rw,nolock,hard,nointr,nfsvers=3
      device: ":/System/Volumes/Data/$PWD"

【问题讨论】:

【参考方案1】:

这是一个疯狂的猜测,但之前发生过,可能与here.上发布的问题有关

问题可能仅仅在于主机系统和容器之间的时间同步。我个人在使用 Mac 的容器上遇到了一些时间问题。

here.也有相关的SO贴

【讨论】:

【参考方案2】:

在 production.rb 中,默认似乎只读取一次代码。您可能需要关闭一些缓存才能进行动态重新加载。如果不是,文件会在容器内外同时更新,但 rails 不在乎。

  # Code is not reloaded between requests.
  config.cache_classes = true 

  config.eager_load = true

您可能需要将其中一项或多项设置为 false?但它可能会影响你的表现。与 development.rb 比较

【讨论】:

以上是关于Docker - Rails Development Auto Reload Broken (Rails 4.2) Mac NFS的主要内容,如果未能解决你的问题,请参考以下文章

流利的没有捕捉毫秒的时间

Docker - Rails Development Auto Reload Broken (Rails 4.2) Mac NFS

docker多个容器连接 将 Rails 程序部署到 Docker 容器中

带有 Docker 的 Rails '在任何资源中都找不到 ...' 用于现有的 gem

Rails 6 Docker 与 PostgreSQL 连接错误

Docker,独立的多个 Rails 实例