読者です 読者をやめる 読者になる 読者になる

Rails on Dockerでbinding.pryする

RailsをDocker上で動かして開発する
DatabaseはMySQLを使ってそれは別コンテナで立ち上げる
これらをうまく扱うためにdocker-compose使ってdocker-compose upで一気に立ち上げられるようにする

みたいなのはよく見る

docker-compose.yml

version: "3"
services:
  database:
    image: mysql:5.7.8
    environment:
      - MYSQL_ROOT_PASSWORD=password
    ports:
      - '3306:3306'
  rails:
    image: my-rails-image
    command: ["bundle", "exec", "rails", "s", "-b", "0.0.0.0"]
    depends_on:
      - database
    volumes:
      - .:/my-rails-project
    ports:
      - "3000:3000"

こんな感じの設定ファイルを用意してdocker-compose upすればブラウザ上でport3000でアクセスできたとする

問題

github.com

を使ってコード内でbinding.pryをしてデバッグをしているが Docker上でたてたrails serverではそれがスルーされてしまった
これをまずとめるにはdocker-compose.ymlを修正する必要があり

docker-compose.yml

version: "3"
services:
  database:
    image: mysql:5.7.8
    environment:
      - MYSQL_ROOT_PASSWORD=password
    ports:
      - '3306:3306'
  rails:
    tty: true # この行と
    stdin_open: true # この行を追加
    image: my-rails-image
    command: ["bundle", "exec", "rails", "s", "-b", "0.0.0.0"]
    depends_on:
      - database
    volumes:
      - .:/my-rails-project
    ports:
      - "3000:3000"

これを追加してコンテナを立ち上げなおす
するとdocker-compose logsを見てみるととまったことがわかる
ただそこはlogsの中身なのでコマンドはうてない

どうするかでいうと docker attach を使う

docs.docker.com

これにより今回の例だとrails serverのプロセスにattachすることが出来るのでbinding.pryでとまっているところでデバッグすることが出来るようになる
終了するときはCtrl-cで抜けることが出来るのだが、これはプロセス自体もとまってしまうのでコンテナがとまってしまうので docker-compose start railsのようにしてstartしないといけない

最後に

docker attachした後Ctrl-cでぬけるとプロセスが終了してしまうのはattachしつづければ良い話でもある
一旦はこれでやっていくがもっとスマートな方法があったら知りたい