環境
- 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
Dockerコンテナ上でbinding.pry
デバッグ時などに使うと便利なrpy-railsですが、Dockerコンテナ上で実行されているRails上で実行するためにはコンテナのコンソールをアタッチします。
docker attach app_container
コンソールをアタッチすると、Railsのデバッグログが表示されて、コンソールでbundle exec rails s
を実行したのと同じ状態になります。
Control-P + Q
でアタッチしたコンソールから抜けることができます。
Control-D
でも抜けることは可能ですが、その場合コンテナ自体も停止します。