在 Windows 上使用 Docker 和挂载卷进行开发时遇到问题

你好,我无法在 Windows 上开发,因为会出现空白屏幕。当我打开控制台时,会看到以下错误:

(X) ember_jquery.js?1579775136.5740232:1 Uncaught Error: Errno::EEXIST: File exists @ dir_s_mkdir - /var/discourse/tmp/cache/assets/sprockets/v3.0/pr
  (in /home/gaijinsailor/.rbenv/versions/2.6.2/lib/ruby/2.6.0/fileutils.rb:239:in `mkdir')
    at ember_jquery.js?1579775136.5740232:1

还有很多类似的错误。

基本上,Discourse 无法加载脚本。当我在单独的窗口中打开脚本时,会看到以下错误:

Script: http://localhost:3000/assets/locales/en_US.js?1579775136.5398135
Body: throw Error("Errno::EEXIST: File exists @ dir_s_mkdir - /var/discourse/tmp/cache/assets/sprockets/v3.0/x2\n  (in /home/gaijinsailor/.rbenv/versions/2.6.2/lib/ruby/2.6.0/fileutils.rb:239:in `mkdir')")

于是我开始深入排查,发现问题是出在 Sprockets 上。我从 Windows 将 Discourse 目录挂载到了 Docker 中,而文件系统是不区分大小写的。Sprockets 似乎只能在类似 Linux 的文件系统(如 ext4)上工作,这些文件系统可以区分目录的大小写。

有什么办法可以解决这个问题吗?
谢谢

更新:Sprockets 的这个已知问题已在 GitHub 上记录:FileStore cache patch in v3.6 causes directory name collisions in Windows · Issue #283 · rails/sprockets · GitHub
但该问题仍处于开放状态,尚未找到解决方案::slightly_frowning_face:

有趣的是,@pixeltrix 昨天偶然发现了这个问题,并使用了这个技巧来绕过它:

我建议大家直接安装 WSL2 并使用我们的 WSL2 配置方案,这样更快,也更容易理解:

开发环境的安装非常简单,你只需要启动 WSL2,安装 Docker,然后使用我们的 Docker 开发配置即可。

4 个赞

非常感谢。这个变通方法奏效了。稍后我会尝试使用 WSL2。

1 个赞