hvystnの日記

備忘録です

Rails6 on Dockerの環境構築

Docker公式のQuickstart: Compose and Railsに従い、Rails6バージョンの環境構築を目指します。
docs.docker.com Railsは6.0.3、Rubyは2.7.1と現在リリースされている比較的新しいバージョンを導入します。

早速、Define the projectに従ってファイルを作成します。
[add]original setup file from docker docs · heavy-stone/rails6-docker@59d2519 · GitHub

RailsRubyのバージョンを変更します。
[update]Rails & Ruby versions · heavy-stone/rails6-docker@310ce26 · GitHub

Build the projectのRails newコマンドを実施しますが、webpacker: installでエラーが発生します。

$ docker-compose run web rails new . --force --no-deps --database=postgresql
...
       rails  webpacker:install
Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/
...

エラーメッセージにYarnがインストールされていないとあるので、Yarnをインストールするパッケージに加えます。
[add]yarn to install webpacker · heavy-stone/rails6-docker@35234c1 · GitHub
再度Rails newコマンドを実施しますが、またwebpacker: installでエラーが発生します。

$ docker-compose run web rails new . --force --no-deps --database=postgresql
...
       rails  webpacker:install
rails aborted!
ArgumentError: Malformed version number string 0.32+git
...

エラーメッセージで調査すると、どうやらYarnのバージョンが不正なバージョン?のようです。
stackoverflow.com
apt-getでそのままYarnを指定してしまうと0.32+gitという変なバージョンが入ってしまうらしいです。

https://github.com/yarnpkg/yarn/releases?after=v1.1.0
また、上記yarnのreleaseを追ってみましたが、0.32のようなversionはありませんでした。謎です。

正しいYarnのバージョンを入れる必要があるため、Yarnの公式Installationに従い、Debian(docker rubyイメージのOS)のインストール方法をDockerfileに追記します。
[update]yarn to stable version · heavy-stone/rails6-docker@6728287 · GitHub
再度Rails newコマンドを実施しますが、先ほど追記したコマンドでエラーが発生します。

$ docker-compose run web rails new . --force --no-deps --database=postgresql
Creating network "rails6-docker_default" with the default driver
Creating rails6-docker_db_1 ... done
Building web
Step 1/15 : FROM ruby:2.7.1
 ---> 958d3491c09a
Step 2/15 : RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
 ---> Running in 9162346e0243
/bin/sh: 1: sudo: not found
curl: (23) Failed writing body (629 != 1369)
ERROR: Service 'web' failed to build: The command '/bin/sh -c curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -' returned a non-zero code: 127

エラーメッセージによると、sudoコマンドがないようです。
調査したところ、そもそもdockerのデフォルトユーザーがrootのため、sudoは必要ないようです。
stackoverflow.com
https://docs.docker.com/engine/reference/run/#user
よって、sudoコマンドを削除します。
[fix]removing sudo from yarn installation · heavy-stone/rails6-docker@b04e163 · GitHub

また、Dockerfile 記述のベストプラクティスによると、DockerはRUNコマンド毎にレイヤーを作成し、レイヤー毎にキャッシュを作成するので、関連性のあるコマンドは一つのRUNコマンドに&&を使用してまとめるべしとあります。
matsuand.github.io
よって、パッケージ関連のapt-getコマンドは一つのRUNコマンドにまとめてしまいます。
[fix]yarn installation with && · heavy-stone/rails6-docker@ac18220 · GitHub

ここまで設定して、再度Rails newコマンドを実施します。

$ docker-compose run web rails new . --force --no-deps --database=postgresql
...
         run  yarn add @rails/webpacker@4.3.0 from "."
yarn add v1.22.5
...
Done in 97.47s.
Webpacker successfully installed 🎉 🍰
...

ちゃんとYarnのStable Version(1.22.5)が入っており、webpackerもインストールできたようです。
[do]docker-compose run web rails new . --force --no-deps --database=p… · heavy-stone/rails6-docker@b2f5258 · GitHub
Rails newで多くのファイルが作成されました。

Docker公式のQuickstartの途中でしたので、Build the projectに戻ります。
Rails newによってGemfileが更新されたので、イメージを再度ビルドする必要があるそうです。

$ docker-compose build

特に問題なく成功しました。

Docker公式のConnect the databaseを実施します。
RailsからPostgreSQLに接続する情報をdatabase.ymlに記載します。
[update]database.yml for pq · heavy-stone/rails6-docker@69a6f8d · GitHub

RailsPostgreSQLをコンテナで起動します。

$ docker-compose up

DBを作成します。

$ docker-compose run web rake db:create

ブラウザで http://localhost:3000 にアクセスすると、Rails6のデフォルトページが表示されていることを確認できました。

Yay! You're on Rails6 on Docker!
Yay! You're on Rails6 on Docker!

まとめ

Docker公式のドキュメントに従い、最小限のRails6の環境構築を実施しました。
ロケール設定、クロック設定、ベストプラクティスの適用、Nodejsバージョン指定、DBをMySQLに変更、シェルによる自動環境構築化、Nuxt環境構築などまだまだやりたいことはあるので、少しずつ書いていきたいと思います。

参考

github.com