🧰
RailsアプリをCloud Native BuildpacksでCloud RunにデプロイしたときにNokogiriでエラーが発生
これまでうまくいっていた方法
以前にRailsアプリをCloud Native BuildpacksでCloud Runにデプロイしました。
私は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のドキュメントを確認してみます。
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-dev
とlibxslt1-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