2
0

【Rails】aarch64で環境を立ち上げた時にNokogiriのインストールでエラーが発生した件

Last updated at Posted at 2024-08-01

どうもこんにちは。

今回は、RailsをAWS Elastic Beanstalk環境へデプロイした時に失敗したので、その時の対処方法を備忘録として残します。

発生していたエラー

今回、デプロイに失敗した理由が、「nokogiri gemが正常にインストールできない」ことでした。

An error occurred while installing nokogiri (1.16.7), and Bundler cannot continue.

In Gemfile:
  dropzonejs-rails was resolved to 0.8.5, which depends on
    rails was resolved to 7.0.5, which depends on
      actioncable was resolved to 7.0.5, which depends on
        actionpack was resolved to 7.0.5, which depends on
          actionview was resolved to 7.0.5, which depends on
            rails-dom-testing was resolved to 2.2.0, which depends on
              nokogiri

なんでだーと思って調べていると、nokogiriってCのネイティブライブラリなんですね。
Cのネイティブライブラリとは、Rubyのためのライブラリというわけではなく、他の言語でも使用されるC言語で開発されたライブラリという認識です。

つまり、「nokogiriが動くために必要なCのライブラリが足りない」かなと推測できます。

犯人だぁれ?

さらに、ちょっとGemfile.lockを確認してみてると、aarch64用のnokogiriがインストールされていました。

Gemfile.lock
nokogiri (1.16.5-aarch64-linux)

犯人はこいつでした。
EB環境はlinux/x86_64環境で動作しているので、そりゃ失敗するわけだ。

どう解決する?

ということで、linux/x86_64アーキテクチャでも動作するようにGemをインストールしなおしましょう。

1. ローカルのDockerfileで必要なライブラリをインストール

RUN apt-get update -qq && apt-get install -y build-essential libxml2-dev libxslt1-dev

2. ビルド

docker-compose build

3. 立ち上げ

docker-compose up

4. --platform=rubyを指定してnokogiriをインストール

docker-compose exec web gem install nokogiri --platform=ruby -- --use-system-libraries

5. force_ruby_platformをTRUEに設定

docker-compose exec web bundle config set force_ruby_platform true

6. bundle install

docker-compose exec web bundle install

Gemfile.lock確認

Gemfile.lock
nokogiri (1.16.7)

マイナーバージョンあがっちゃったけどまぁOK!

これでEB環境にデプロイしてもエラーは消えました。

まとめ

Mac使っている人は、アーキテクチャの違いに気をつけてデプロイしたり環境構築したりすると良いと思います。

以上

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0