Ruby on Rails在苹果Silicon(M1)上的Docker

9

我试图在苹果芯片(M1)的Macbook上运行一个Ruby on Rails项目。我的问题在于Javascript runtime。gem mini_racer依赖于libv8,但是其无法正确安装。有人遇到类似的问题,似乎要么编译源代码安装V8,并强制使用系统版本的libv8/mini_racer,要么使用NodeJS代替。

是否有人已经在M1芯片上成功地在Docker中运行了带有Javascript runtime的RoR项目?


2
我对这个主题缺乏信息感到有些惊讶。一定有更多的人在M1 Mac上使用Docker进行Rails开发。你们都在用什么? - Fredrik
目前还没有人在 M1 上成功地在 Docker 中运行 Rails 吗? - Fredrik
2个回答

5

从V8的角度来看,我能说的是:

  • 在M1硬件上运行最近的V8版本(8.7及更高版本)完全没有问题。
  • 尚不支持在M1 Mac上编译V8(但将来会支持);现在您必须在Intel Mac上进行交叉编译。
  • 在评论中,您说“在Ubuntu上使用Docker容器运行此程序”。在这种情况下,请查看https://bugs.chromium.org/p/v8/issues/detail?id=6458#c7。通常情况下,在Linux-arm64上编译V8应该是可行的。
  • V8 3.16实际上来自石器时代(8年前),当时甚至没有arm64端口,因此如果您被困在那个版本上,您将不得不使用32位arm构建,并且可能需要使用旧的编译器并手动选择正确的(旧)版本的一些依赖项。我最近听说,在arm64机器上构建32位arm不起作用(因为历史上从未有人有理由这样做),因此您将再次寻找在x86机器(32或64位)上进行交叉编译。
  • 不同的V8分支通常不兼容ABI;因此,如果您的mini_racer版本需要V8 3.16,则需要进行大量工作才能将其更新为与V8 8.7(或当前稳定版本8.9)兼容。即使是交换3.15和3.16也是可疑的,很可能不起作用。

我不熟悉RoR或Docker,因此无法就这些具体问题提供帮助。


2

据我所记,这与M1无关,而是mini_racer在libv8方面存在一些问题,但通常我们在Mac上使用以下方法来解决问题:

brew tap homebrew/versions
brew install v8-315

gem install libv8 -v '3.16.14.13' -- --with-system-v8
gem install therubyracer -- --with-v8-dir=/usr/local/opt/v8-315

bundle install

但不确定为什么它会在您的Docker上发生,另一种方法是检查v8安装位置,并将--with url更改为该路径。

在错误提交之前,在Docker中让构建完成,然后您可以ssh进入并尝试本地命令。有人建议以下解决方案。

RUN gem install -N libv8 -v '3.16.14.13' -- --with-system-v8 \
 && bundle config --global build.libv8 --with-system-v8

您可以分享您的Docker文件,这样我们可以先确认它在普通机器上是否可用,然后再进行尝试。但是,当然,M1是不同的架构,一些程序还没有为其做好准备。


感谢您的回复。但是,由于我正在使用Ubuntu中的Docker容器运行此程序,Homebrew无法解决问题。 - Fredrik
好的,我已经更新了响应,请尝试一下,或者分享你的Dockerfile,这样我可以在普通的Macbook上检查!至少分享它不是关于文件/系统,而是关于处理器M1架构问题。 - Kamal Panhwar
问题似乎出在 M1 上的 V8。我在 Intel MacBook Pro 上运行相同的 Docker 文件,没有任何问题。 - Fredrik
1
哦,好的,是的,我觉得M1对开发人员来说会很麻烦。 - Kamal Panhwar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接