Dockerで起動しているRailsのコンテナがある場合に、そのRailsサーバーの中で、rails c
でコンソールを開いて、irbを使って処理やデバッグをしたいという時があります。
このためには、Dockerの中のRailsコンテナの中に入ってrails cを実行する必要があります。
ここでは、Dockerの中のRailsコンテナの中に入ってrails cを実行する方法を実例で解説しています。
Dockerの中のRailsコンテナの中に入ってrails cを実行する方法
実例
##入りたいコンテナ名を確認
docker ps
##コンテナに入る
docker exec -it コンテナ名 /bin/bash
##railsコンソールを開く
rails c
##railsのコンソールが起動
irb(main):001:0>
以下でコードを解説します。
docker ps
まずは現在起動中のDockerコンテナの一覧を表示します。
するとコンテナのIDやコンテナ名が表示されます。
docker ps
実例
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ca9b5e57ff9 rails-app:latest "/scripts/start.sh" 19 hours ago Up 19 hours 0.0.0.0:3000->3000/tcp rails-app
上記のCONTAINER ID「0ca9b5e57ff9」と NAMES「rails-app」のどちらかが必要です。
なお、停止中のコンテナの中にはいることはできません。必要に応じて、docker-compose up
やdocker start
などしてコンテナを起動してください。
docker exec -it コンテナ名 /bin/bash
コンテナ名(あるいはID)がわかったので、続いてコンテナ内に入ります。
以下の「コンテナ」のところに、コンテナ名かコンテナのID番号を記載してください。
docker exec -it <コンテナ> /bin/bash
なお、一番末尾の「/bin/bash」は「sh」でも問題ありません。
docker exec -it <コンテナ> sh
実例
コンテナIDを指定する場合は以下のようになります。
末尾を「/bin/bash」にするとコマンドを入力する場所(#)の前にroot@コンテナ名が表示されます。
$ docker exec -it 0ca9b5e57ff9 /bin/bash
root@0ca9b5e57ff9:/app#
末尾を「sh」にした場合は以下のようになります。
$ docker exec -it 0ca9b5e57ff9 sh
#
どちらも同じくコンテナの中です。
もちろんコンテナIDではなく、コンテナ名を指定することもできます。
$ docker exec -it rails-app sh
#
なお、コンテナから抜ける時は「exit」と入力します。
rails c
railsアプリケーションのあるディレクトリにいるのと同じ状態です。ここでrailsのコンソールを起動するコマンドを入力します。
rails c
なお「c」 は「console」の省略形です。省略せずに以下のようにしても同じ処理になります。
rails console
実例
# rails console
`Redis#exists(key)` will return an Integer by default in redis-rb 4.3. The option to explicitly disable this behaviour via `Redis.exists_returns_integer` will be removed in 5.0. You should use `exists?` instead.
Loading development environment (Rails 6.1.4)
irb(main):001:0>
railsのコンソール(対話モード)irbが起動しました。なおirbとは「interactive Ruby」の略です。
これまでの処理でターミナルが以下の順番で変化していることがわかります。
- ローカルの「$」
- dockerの「root@コンテナ名:ルートパス#(あるいは #)
- railsの「irb(main)」
終了方法と注意点
終了方法
終了するときはexit
かquit
を入力しEnterします。
抜ける時は、「irb」を終了して、次に「Railsコンテナ」から抜ける必要があります。
//irbから抜ける
irb(main):001:0> exit
//Dockerのコンテナから抜ける
# exit
//元の状態
$
irbで末尾の番号が0以外の場合
irbを使っているときに、「irb(main):014:2」といったように末尾の番号が0以外のときは処理の入力途中とみなされています。ctrl + c
でクリアしてからexitしてください。
##末尾が0以外だと抜けられない(式の途中と見做されている)
irb(main):014:2> quit
irb(main):015:2> exit
irb(main):016:2>
##ctrl + c でクリアしてからexit
irb(main):017:0> exit
(参考)irb処理
irbが正しく動いているか確認するには、処理をしてみてください。
irb(main):001:0> p "hello rails"
"hello rails"
=> "hello rails"
irb(main):002:0> 1+2
=> 3
複数行の処理を入力する場合は以下のようになります。
irb(main):015:0> for i in 1...11 do
irb(main):016:1* print "#{i} "
irb(main):017:1> end
1 2 3 4 5 6 7 8 9 10 => 1...11