reona.dev

Railsアプリケーション開発時のDocker構成


WEB アプリケーション開発に参画すると、Docker でアプリケーションやミドルウェアを実行することになることが多いと思う。 実際に私が 2 年弱の開発経験のなかで携わったプロジェクトの多くが Docker を利用していた。

環境構築を簡単に行なうことができるのは大きなメリットではあるが、次のようなデメリットもある。

  • メモリの使用量が非常に多い。(特に Docker for Mac の場合は Linux と比べて多いらしい)
  • アプリケーションコマンド実行時、docker-compose exec(run) ${container_name} を先頭につける必要がある。
    • コマンド入力に数秒程度長くかかる
    • docker-compose run(exec) ${container_name} bash でコンテナでシェルを実行することでコマンド実行に関しては楽になる
  • コマンドの実行時間が直接のアプリケーションコマンドの実行時間に対して長くかかる

コマンドの入力や実行に関する時間は 1 つ 1 つを考えれば微々たるものではあるが、開発時にコマンドを実行する機会は少なくないため、Developer Experience を高める上で改善には価値があると考える。

基本的にアプリケーションをコンテナで実行するように構成されているプロジェクトが大半ではあるが、現在のプロジェクトでは Rails アプリケーションと Webpacker をローカルで直接実行し、DB などのミドルウェアをコンテナに載せるようにしている。host など、別途設定が必要な部分がある場合には、設定を変更したうえで以下を実行している。

$ git update-index --skip-worktree ${file_name}

ミドルウェアがローカルでも立ち上がっている場合、コンテナではなくローカルのサーバーを優先することがあるので注意が必要。

言語のバージョンを指定したりなど、最初の手間はあるが、

  • Rails コマンドを直接ターミナルに打てる
  • コマンド実行時間が短くなる
  • メモリの使用量が減り、マシンの発熱が少なくなる(バッテリーの持ちがよくなる)

など、個人的にはメリットが完全に勝っている印象。

Mac での開発で上に挙げた Docker のデメリットに悩まされてる方は少なくないように感じるので、一度試していただきたい。