Docker環境でByebugを使う方法

概要

Railsチュートリアルの第7章でByebugを使っています. Docker環境でByebugを利用するためには, 追加手順が必要なので書き残しておきます.

本当ははじめから全てが整った環境を構築できれば申し分ないですが, 途中からでも以下の手順を実行すれば問題ありません.

手順

以前書いたこちらの記事の通りに環境が出来上がっている状態からスタートします.

docker-compose.ymlに, 以下の設定を加えます.

# docker-compose.yml
services:
  web:
    stdin_open: true
    tty: true

これら2つの設定により, コンテナ内の標準入出力をローカルマシンのターミナルにアタッチする準備が整います.

さてComposeファイルを修正したので, それを反映させなくてはなりません. 先ほども述べたように, すでに環境が構築し終わった後にこの変更を加えています. この場合は以下のコマンドを実行すればOKです.

$ docker-compose up -d

公式ドキュメントを見て, コマンドの説明を見てみましょう.

If there are existing containers for a service, and the service’s configuration or image was changed after the container’s creation, docker-compose up picks up the changes by stopping and recreating the containers (preserving mounted volumes).

service's configurationへの変更は, コンテナを再構築することにより適用されるということですね.

コンテナが起動した状態でもいいの?

上で引用した説明分に書かれているように, すでにコンテナを起動している状態でも上のコマンドを実行することができます.

docker-compose restartではないの?

これについては公式ドキュメントに書いてあります.

If you make changes to your docker-compose.yml configuration these changes are not reflected after running this command.

このコマンドではComposeファイルの変更は反映されません.

docker-compose buildからやり直す必要はないの?

これも公式ドキュメントに書いてあります.

If you change a service’s Dockerfile or the contents of its build directory, run docker-compose build to rebuild it.

このコマンドを使うのは, DockerfileGemfileに変更があった場合です.

Byebugの使い方

上の手順を実行することにより, Byebugを使う準備が整いました. ここからはByebugの使い方です. 以下のコマンドを実行し, コンテナが起動した状態にあるとします.

$ docker-compose up -d

次のコマンドで, Railsが動いているコンテナのIDもしくはコンテナ名を調べます.

$ docker ps

あとは今調べたコンテナの標準入出力を, ローカルマシンのターミナルにアタッチするコマンドを実行します.

$ docker attach <container name or ID>

この状態でWebアプリケーションにアクセスすると, Byebugの出力がターミナルに表示されます.

デタッチする

コンテナの標準入出力を, ローカルマシンのターミナルにアタッチする方法がわかりました. 大事なのはここからです. デタッチを正しく行わないと面倒なことになります.

デバッグが終了し, コンテナの標準入出力をデタッチしたい場合は以下を実行してください.

Ctrl+P, Ctrl+Q

つまりCtrlキーを押しっぱにしたままpqと押せばいいわけですね. もしCtrl+Cを押してしまった場合は面倒なことになる可能性があります. そのときは こちらの記事を参照してください.