Docker+Rails環境で開発をする
PICK UP POST

Docker+Rails環境で開発をする

環境

  • macOS High Sierra 10.13.6
  • Docker Community Edition Version 18.06.0-ce-mac70
  • Ruby 2.4.1
  • Ruby On Rails 5.1.4

みなさんこんにちは。

サーバサイドに出戻りエンジニアの金子です。

最近サーバサイドの開発をしていますが、しばらくiOSエンジニアとして動いていたため、いろいろ取り残されている感じがあります。
先日手始めに、Dockerで開発環境を構築してみました。

いまさらDockerでRails(API)+Rails(worker)+SQS+MySQLの環境を構築してみた

今回はDocker環境で開発する前に、こんな場面ではどうするんだろうと疑問に思っていたことと、その場面での実際の対応方法をご紹介したいと思います。

編集したソースコードをDockerコンテナに反映する

私の環境ではホストOSはMacでDocker for Macの環境のため、ソースコード編集はホストOS上のvimで行い、実行環境はDockerコンテナという構成になっています。

↑大雑把ですが上図のようなイメージです。

開発時には編集したソースコードをDockerコンテナに反映する必要がありますが、開発ディレクトリをDockerコンテナにマウントすることで編集時に即時反映することが可能です。

  app:
    tty: true
    stdin_open: true
    build:
      context: .
      dockerfile: Dockerfile-dev
    container_name: app_container
    command: bundle exec shoryuken -R -C config/shoryuken.yml
    networks:
      - default
    volumes:
      - .:/app

開発環境一式を以前書いたブログにまとめたようにdocker-composeで管理しているので、docker-compose.ymlで上記のようにvolumesの設定をすることで、実行ディレクトリをそのままdockerのアプリ実行ディレクトリにマウントすることができます。

Dockerコンテナ上でrails c

ログファイルの確認は開発ディレクトリの中身をマウントしているので直接tailするなりして見ていますが、rails cを使う場合、Dockerコンテナ内にしか開発環境がない状況ではコンソールにログインして実行する必要があります。
実際の方法を調べるまではサーバのようにコンテナに対してSSHログインするのかと思っていましたが、よく考えてみたら1プロセスで動いているコンテナにSSHサーバは入っていないので、SSHでログインするということはありませんでした。
コンテナ上でコマンドを実行する場合には以下のようにシェルにアクセスします。

docker exec -it app_container bash

上記の例ではapp_containerというDockerコンテナのbashに入れます。

あとはrails cコマンドを実行するのみです。

lanchester@3d2232e5186f:~$ bundle exec rails c

2018/11/7 追記
上記の方法は少し回りくどかったです。
以下のコマンドでrails c実行できます。

docker exec -it api_container bundle exec rails c

Dockerコンテナ上でbinding.pry

デバッグ時などに使うと便利なrpy-railsですが、Dockerコンテナ上で実行されているRails上で実行するためにはコンテナのコンソールをアタッチします。

docker attach app_container

コンソールをアタッチすると、Railsのデバッグログが表示されて、コンソールでbundle exec rails sを実行したのと同じ状態になります。

Control-P + Qでアタッチしたコンソールから抜けることができます。

Control-Dでも抜けることは可能ですが、その場合コンテナ自体も停止します。

TAG

  • このエントリーをはてなブックマークに追加
金子 将範
エンジニア 金子 将範 rubyist

新しいことや難しい課題に挑戦することにやりがいを感じ、安定やぬるい事は退屈だと感じます。 考えるより先に手が動く、肉体派エンジニアで座右の銘は諸行無常。 大事なのは感性、プログラミングにおいても感覚で理解し、感覚で書きます。