macOSでのRails開発 — mysql2のインストールとDocker接続でハマった記録

新しいデバイスのセットアップなど、そう頻繁にやる作業ではないはずなのに、不思議と何度も遭遇する mysql2 gem のインストールエラー。毎回すんなり通らず、毎回調べ直している気がするので、さすがに不毛だと思いメモしておきます。

mysql2のインストールエラー

典型的なエラーはこれです。

ld: library not found for -lssl

HomebrewのOpenSSLパスをmysql2のビルドが見つけられていません。bundle config で明示的に指定すれば通ります。

bundle config --local build.mysql2 \
  "--with-ldflags=-L/usr/local/opt/openssl/lib \
   --with-cppflags=-I/usr/local/opt/openssl/include"

ただし Intel MacとApple Silicon(M1以降)でHomebrewのパスが違います

  • Intel: /usr/local/opt/
  • M1以降: /opt/homebrew/

過去の解決記録をそのまま貼っても動かないことがあるので、自分の環境に合わせてパスを読み替える必要があります。

Docker上のMySQLに接続できない

mysql2を乗り越えた次の罠がDocker上のMySQLへの接続でした。

  • Docker Composeで立ち上げたMySQLコンテナに、ローカルの mysql コマンドから接続できない
  • コンテナ内からは通る。phpMyAdminも通る
  • docker ps で重複起動なし、ポートマッピングも3306で正しい

原因は Dockerとは無関係にローカルのmysqldが起動していた ことでした。

COMMAND     PID   USER     FD   TYPE  ...
mysqld     6618  username  23u  IPv4  ...  TCP localhost:mysql (LISTEN)
com.docke 91253  username  84u  IPv6  ...  TCP *:mysql (LISTEN)

lsof -i :3306 で確認すると、ポート3306をDockerとローカルのmysqldが取り合っていました。「docker ps で確認したから大丈夫」という先入観にやられた形です。

このときはローカルのmysqldプロセスを止めて解決しました。Docker環境でMySQLを使うなら、ローカル側のmysqldが起動していないか lsof -i :3306 で確認するのが確実です。

Related Posts