開発環境構築
開発環境と本番環境についてで言及した通り本件のrailsアプリはDocker上で動作するように作成する。そのため開発段階で開発用のコンテナを導入する。 また、本番環境のコンテナについては開発がおおよそ完了した段階で導入する。しかし開発環境とあまりにかけ離れることは良くないと考えたためできるだけ差異を小さくできるように心がける。
ベースイメージの選定
開発用コンテナを作成するためのベースイメージを選定する。
本件におけるRubyとRailsのバージョンについては開発環境と本番環境についてで示したとおり以下のとおりである。
バージョン | |
---|---|
Ruby | 3.1.2 |
Rails | 7.0.4 |
Rubyをインストールできれば簡単にRailsをインストールできるため、この点を最も簡単に解決できる方法としてはDockerのオフィシャルイメージにあるRubyイメージを使う方法だと考えられる。 しかし、この方法は以下の点で問題があると考えたため、Ubuntu 22.04のイメージをベースに作成していくことにした。
- Ruby以外にも必要なツールがあること。(例:sass、Node.js、yarn)
- ディストリビューションが基本的にalpineまたはdebianであること。
- 学習の一端として環境構築はしっかりと経験したいこと。
1と3にはある程度関係がある。Rubyがすでに入っているイメージを使えば簡単にRubyを導入できるが、その他のソフトもインストールしなければいけない。また、Dockerfileを書く練習や環境構築に必要なソフトがなにか調べることにもつながるため、ディストリビューションのイメージファイルから開始するのが良いと考えた。
2つ目に関してはN君のホストOSに関係がある。N君のホストOSはUbuntuであるため、コンテナ側もUbuntuにすれば発生する問題に関して経験したことがある可能性が高く、対処しやすいと考えたそのためRubyをインストールしたイメージは適切でないと考えたこと。Rubyイメージのベースとなるbuildpack-devsにはUbuntuもあるが、わざわざ探すよりUbuntuからはじめてインストールしたほうが早く完成でき、自分が何を使っているか明確になる利点もあるためUbuntuイメージを使用することを考えた。
イメージの改造
前述の通り、開発用コンテナのベースイメージはubuntu:22.04を選定した。このイメージにDockerfileを使用して以下の項目をインストール及び設定する。
一般ユーザの追加はDockerfile のベスト・プラクティスの観点や開発時のファイル編集を効率よく行うために実行する。Dockerは基本ユーザを追加しない限りrootユーザとして実行される。Docker単体で使う場合は問題ないが、本件はホスト側から頻繁にファイルを編集するためDocker側で作成(rails new など)したファイルの権限をいちいち書き換えるのは非常に手間がかかる。そのためDocker側とホスト側のユーザを合わせて置くことで権限の問題を回避しつつ、Dockerfileのベストプラクティスの注意点を満足できると考えたためユーザを追加する。
Ruby&Railsについては必須である。インストール方法はrubyのダウンロードページを参考にしサードパーティツールを使用した。rbenvを使用することで指定のバージョンをインストールする。
Node.jsおよびyarnについては必須ではない。しかしcssフレームワークを使用する場合を考えてインストールする。Node.jsのインストールはRubyの場合と同様にサードパーティツールを使用しインストールする。yarnについてはNode.jsと同時にインストールされるnpmを使用してインストールできることがyarnのホームページに書かれているため、その方法を検討した。
Dockerfile化
前述までの内容を考慮しdocker build
コマンドで開発環境を整えるDockerfileを作成した。Dockerfileは以下のリポジトリのDockerfile_dev_guとして配置している。
これで開発環境イメージの作成は以上である。
追記:Docker Composeの導入
開発を開始してしばらくはdocker run
コマンドでコンテナを作成していた。しかし、ネットワークの設定や環境変数など追加の設定がある場合、Dockerfileだけで運用するのが手間になってきた。そのためコンテナを作成する目的以外の設定についてはdokcer-compose.yml
にまとめることでコンテナの作成の手間を減らすことにした。この場合コンテナ作成も単純にdocker compose up -d
とするだけで、設定などもファイルに明記することができるメリットがある。そのため本件ではdocker compose
でコンテナの作成をすることにした。
コンテナ作成はDockerfileとdocker-compose.ymlがあるディレクトリで、以下のコマンドを実行することで作成できる。
docker build -t rails_container:rails_on_jammy .
docker compose up -d
docker composeでイメージをビルドできるが、すでにイメージは別途で作成済みであった。ビルド込みで実行すると非常に時間がかかる。そのためビルドは切り分ける構成にした。そのためイメージ作成コマンドとコンテナ作成コマンドの2段階で作成する。