🧰

RailsアプリをCloud Native BuildpacksでCloud RunにデプロイしたときにNokogiriでエラーが発生

2023/01/05に公開

これまでうまくいっていた方法

以前にRailsアプリをCloud Native BuildpacksでCloud Runにデプロイしました。

https://zenn.dev/kaorumori/articles/de50404e3a034f

私はGoogleのビルドパックを利用していました。

Ruby 3.2.0にアップデートして発生したエラー

Ruby 3.1.2を使っていたときは問題なくデプロイできていたのですが、Ruby 3.2.0にアップデートしたところ、デプロイ時に以下のようなエラーが出力されました。

[builder] checking for xmlParseDoc() in -lxml2... no
[builder] checking for xmlParseDoc() in -llibxml2... no
[builder] checking for libxml-2.0 using `pkg_config`... no
[builder] Please install either the `pkg-config` utility or the `pkg-config` rubygem.
[builder] checking for xmlParseDoc() in -lxml2... no
[builder] checking for xmlParseDoc() in -llibxml2... no
[builder] -----
[builder] extconf.rb:285:in `ensure_package_configuration'
[builder] extconf.rb:648:in `<main>'
[builder] xml2 is missing. Please locate mkmf.log to investigate how it is failing.

Nokogiriの関連ライブラリについて

libxml関連のエラーのようなので、Nokogiriのドキュメントを確認してみます。

https://nokogiri.org/tutorials/installing_nokogiri.html#installing-using-the-packaged-libraries

Nokogiriはlibxml2とlibxsltのソースコードを更新し、パッチを適用したものをパッケージ化しています。デフォルトでは、Nokogiriのインストールはこれらのパッケージ化されたライブラリをコンパイルして使用します。

もう一度ログを確認してみると、bundleの実行オプションが以下のようになっていました。

bundle install (NOKOGIRI_USE_SYSTEM_LIBRARIES=1 MALLOC_ARENA_MAX=2 LANG=C.utf8)

NOKOGIRI_USE_SYSTEM_LIBRARIESが指定されているので、関連ライブラリはOSで用意する必要がありそうです。

関連ライブラリのインストールを指定

インストールするパッケージにlibxml2-devlibxslt1-devを追加します。

builder.Dockerfile
FROM gcr.io/buildpacks/builder:v1
USER root
RUN apt-get update && apt-get install -y --no-install-recommends \
  libpq-dev zlib1g-dev liblzma-dev libxml2-dev libxslt1-dev patch && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/*
USER cnb

builder.Dockerfileだけでなく、run.Dockerfileにも同様の変更をします。

デプロイ

ここまでの変更でRuby 3.2.0にアップデートしたRailsアプリをCloud Runにデプロイすることができました。

Discussion