はじめに
Railsのアップグレード作業中、下記エラーとなりRailsアプリを起動できない事態に遭遇した。
かなりハマったので、備忘録がわりにまとめます。
ちなみに、DBはMySQLを使用しています。
Rails 8.0→8.1
Ruby 3.4.6→4.0.0
へのアップグレード作業中のエラーでした。
An error occurred while loading hoge.rb.
Failure/Error: ActiveRecord::Migration.maintain_test_schema!
ActiveRecord::ConnectionNotEstablished:
TLS/SSL error: Certificate verification failure: The certificate is NOT trusted.
# --- Caused by: ---
# Mysql2::Error::ConnectionError:
# TLS/SSL error: Certificate verification failure: The certificate is NOT trusted.
前提条件
Rubyのみのバージョンアップをする時の手順としては以下の流れでした。
- Dockerfile上で使用しているイメージのRubyのバージョンを書き換える
- buildする
結論
使っているDockerイメージ(ベースイメージ)の変更が原因。
Rubyのバージョンを変える際にDockerイメージのタグを明示/固定しないと、ベースOS(Alpine)側のライブラリ更新に巻き込まれ予期せぬ挙動変化が起きる可能性があります。
例えば、以下のようにDockerfileを書き換えると、Alpineの場合、Alpine Linuxの最新バージョン(例:alpine3.23など)を使ってビルドすることになる。
FROM ruby:4.0.0
しかし、(作業時の)Dockerイメージの最新のものでは、Alpine Linuxのmariadb-connector-cのバージョンアップがされており、それが原因でエラーが発生しました。
解決方法は2つ:
- 環境変数を追加する(
MARIADB_TLS_DISABLE_PEER_VERIFICATION=1) - Dockerイメージのタグを固定する(今回はこちらを採用しました)
調査の流れ
細かい単位で、RubyやRailsのバージョンアップを行った結果、Ruby3.4.6→3.4.7に挙げるとエラーとなることがわかりました。
しかし、実際にはRubyのバージョンが直接的な原因ではなく、同時に更新されたDockerイメージに含まれるライブラリが原因でした。
Dockerイメージはバージョンを指定しないと、最新のものを使用するが、alpineは先方がビルドをするものです。ビルドがし直された新しいものはmariadbのバージョンが変わっており、このようなエラーになる可能性がありました。
結果として、Dockerfileの指定を下記のように固定することで解決
FROM ruby:4.0.0-alpine3.22
背景
Alpine Linux 3.23から、mariadb-connector-cが3.3.x系から3.4.x系に切り替わり、TLS証明書検証の挙動が変更され、信頼できない証明書ではエラーが発生するようになっていました。
この経緯自体は、割と早い段階で見つけることができていました。
しかし、アプリで使用しているDBはMySQLなのに、なぜ違うDBの話が関係してくるのか、という点が特にハマったポイントだった。
下記の記事が参考になりました。
mysql2 gemを使用していましたが、これは内部でmariadb-connector-cを使用しているため、関係してくるということなのかなと思います。
一応、関連するissueもありました。
https://github.com/brianmario/mysql2/issues/1379#issuecomment-2671004051
まとめ
本当に想定外のところが原因でエラーになることがあるんだなと思いました。
とはいえ、エラー文や、どこで発生しているえたーなのか、を参考に、まずは、関連しそうなGitHubのissueを探しに行くのが解決の近道であることは間違いなさそうでした。
参考
https://social.treehouse.systems/@ariadne/115742811691619234
https://github.com/brianmario/mysql2/issues/1379#issuecomment-2671004051
https://methane.hatenablog.jp/entry/2024/11/07/172214
https://wiki.alpinelinux.org/wiki/MariaDB