Docker上に起動しているコンテナでRailsを使ったプロジェクトがあるときに、ローカルでモデルを使ってデータベースの中身を確認したいときがあります。
そのときに、「rails c」コマンドでRailsのコンソールに入って、「user.all()」といったメソッドを実行した場合に以下のようなエラーが発生することがあります。
ActiveRecord::ConnectionNotEstablished
このときの原因と対処法をまとめています。
エラーの原因
エラーの原因は、コンテナの中ではなく、ローカルのディレクトリの中でRailsコンソールを起動している可能性が最も高いです。
ローカル環境のディレクトリにRailsがインストールしてある場合、「rails c」を実行するとローカルのRailsのプロジェクトのコンソールを立ち上げることができます。
しかし、これはDocker上のRailsコンテナとは完全な別物になります。
このため、ローカルのプロジェクト中に、指定したモデルがないと「ActiveRecord::ConnectionNotEstablished」というエラーが発生します。
対処法
対処法はDockerで起動しているコンテナの中に入って、「rails c」でRailsコンソールを立ち上げてコマンドを実行することです。
以下で実例で手順を解説しています。
起動中のRailsコンテナ名を確認する
Docker上のRailsコンテナに入るために、まずは起動中のコンテナ一覧を表示して、コンテナ名を確認します。
起動中のコンテナを確認するコマンドは以下です。
$ docker ps
実例
#コンテナ名の確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
588188913f4c rails6-docker-alpine_web "bin/rails s -p 3000…" 3 hours ago Up 3 hours 0.0.0.0:3000->3000/tcp rails6-docker-alpine_web_1
6a965250e960 postgres:11.1-alpine "docker-entrypoint.s…" 20 hours ago Up 3 hours 5432/tcp rails6-docker-alpine_db_1
上記の場合、RailsのコンテナはコンテナID「588188913f4c」、コンテナ名「rails6-docker-alpine_web_1」です。
Railsコンテナの中に入る
続いてRailsのコンテナの中に入ります。起動中のコンテナに入るコマンドは以下です。
$ docker exec -it <コンテナ名> sh
実例
#コンテナ内に入る
$ docker exec -it rails6-docker-alpine_web_1 sh
/usr/src/app #
するとアプリケーションのディレクトリの場所の後ろに「#」が表示されます。
これでDockerコンテナの中のRialsでコマンドを入力できる状態になります。
Railsコンソールを起動する
Railsのコンソールを起動します。
# rails c
実例
/usr/src/app # rails c
Running via Spring preloader in process 130
Loading development environment (Rails 6.1.3.1)
irb(main):001:0>
railsのコンソール「irb」が起動しました。
モデル経由でデータベースのデータを取得する
これで、モデル経由でデータベースのデータを取得できる状態になっています。
例えば、userモデルを使って、usersテーブルのid番号1のデータを取得する場合は以下のようになります。
実例
irb(main):004:0> User.find(1)
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
=> #<User id: 1, name: "aaabbb", created_at: "2021-04-03 07:35:30.551136000 +0000", updated_at: "2021-04-03 07:53:48.907671000 +0000">
無事データが取得できました。