docker で rails 環境立ち上げるときにpostgresqlのSCRAM認証で詰まった

より正確に言うと、libpqのversion10系以上がインストールできなくて困っていた

サマリー

libpqのversion10系以上がインストールは、 /etc/apt/sources.list に  deb http://ftp.jp.debian.org/debian sid main を追加して apt-get updateをしたら解決した。

docker-compose で rake db:createできないのは、ベースイメージをruby:2.7.4-silm から ruby:2.7.4 にすることで解決した

本題

dockerないし、docker-composeでrails の環境を構築しようとして、私は何度もつまずいている。 原因は毎回違うが、他にも詰まる人がいるかもしれないので、いくつか書き留めて置こうと思う。

環境構築の手順は基本的に、公式のdockerでrails環境を作成する手順 に従えばいい。しかし、OSの違いや、記事が古くなったことによってうまくいかないことはある。私も、つい数ヶ月前はこの手順通りでうまくいったはずが、今回は詰まった。

はまったのは

SCRAM authentication requires libpq version 10 or above
Couldn't create 'myapp_development' database. Please check your configuration.

というエラー。 docker-compose run web rake db:create を実行したときに出てきて進めなくなった。

SCRAM認証とはpostgresqlが導入している認証形式である。 軽く調べると、この認証を迂回してmd5形式にする方法も出てくるが、md5では心もとない。

そもそもSCRAM認証が導入されたのはずっと前で、古いライブラリしか入っていない事自体、問題である。

エラーメッセージの libpq というのが、C言語で書かれた libpq-dev というライブラリで、 postgresql にアクセスするときに使われている。ほとんどの言語でクライアントライブラリで使われているようなので、railsに限らずここではまる人はいるだろう。

それでは、コンテナの中に入って libpqが入っているか確認してみる。 usr/lib 下に無いライブラリのほうが多いが、一応。

/myapp# ls -a /usr/lib/ | grep pq    # 結果は何も帰ってこない

コンテナの中にいるので、そのままlibpqをインストールしてみる

myapp# apt-get install -y libpq-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libpq-dev is already the newest version (9.6.23-0+deb9u1).

どうやら入っていたらしい。しかしバージョンが9系だ。エラーメッセージは10以上を入れてくれと言ってるので、これでは不足。

apt list しても9系しかでてこない。

libpqに問題があるとか、 libpq5を先にインストールするような記事もでてきたが、どうもうまくいかない。該当のバージョンがないといわれる。

apt-get は /etc/apt/sources.list に書かれているURLに行ってパッケージを探しにいくので、libpq-devがあるURLを追加して apt-get update を走らせる

deb http://ftp.jp.debian.org/debian sid main  # 追加

すると、先程のコマンド ( apt-get install -y libpq-dev )で

libpq の14系がインストールできた。

rake db:create

を打つと、問題なく databaseが作成できた。

これで終りかと思ったが、 コンテナの外に出て、

docker-compose run web rake db:create と打つと、最初のpostgresqlのエラーがでた。コンテナ内でコマンド実行するのと、コンテナの外から実行するので権限周りが違うのかと思い、いろいろと調べたがうまく行かず、

ベースイメージをruby:2.7.4-silm にしていたので、 ruby:2.7.4 にして、Dockerfile内で

echo 'deb http://ftp.jp.debian.org/debian sid main ' >> /etc/apt/sources.list

を追加して最初からやり直したらうまくいった。 -slim が何かの問題を起こしていたのだろうが、詳細はわからなかった。

注意点 / チェックポイント

間違えやすいポイントは、追加するURLが /debian/ までであることと、 /etc/apt/sources.list を変更した後に apt-get update を走らせること。