Docker on Apple Silicon (M1) 中的 Ruby on Rails

问题描述

我正在尝试让 Ruby on Rails 在 Apple Silicon (M1) Macbook 上的 Docker 中运行。我遇到的问题是 Javascript 运行时。 gem mini_racer 依赖于未正确安装的 libv8。有类似问题的人似乎要么从源代码编译 V8,要么强制 libv8/mini_racer 使用系统版本。另一条路径似乎是改用 NodeJS。

有没有人在 M1 芯片上的 Docker 中启动并运行带有 Javascript 运行时的 RoR?

解决方法

我记得似乎不是关于 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

您可以共享您的 dockerfile,以便我们首先确认它在正常机器上运行,然后您可以尝试。但当然 M1 是不同的架构,有些程序还没有准备好。

,

从 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,所以我无法帮助了解这些细节。)