【M1 Mac】Railsの開発環境をdocker-composeで作成する
当ページのリンクには広告が含まれています。
M1 MacでもDockerでRails開発環境作れるの?という疑問に答えていきます!
- この記事の対象者:M1 Macにdocker-composeでRailsの環境を作りたい方
- M1 Macにdocker-composeを用いてRails環境をを構築する流れ
- まとめ:M1 Macにdocker-composeを用いてRailsの環境を構築する方法をまとめました。
この記事の対象者:M1 Macにdocker-composeでRailsの環境を作りたい方
WindowsのPCを用いている方は、以下の記事を参照してください。
>> 【Windows】DockerでRuby on Rails開発環境構築方法
M1 Macにdocker-composeを用いてRails環境をを構築する流れ
- Docker Desktop for Macのインストール
- Dockerfileの作成
- Gemfileの作成
- Gemfile.lockの作成
- docker-compose.ymlの作成
- MySQLの設定ファイルの作成の設定
- Rails開発環境の構築
docker Desktop for Macのインストール
以下の記事にまとめられているインストール方法で問題なく導入できます。
Macbook Pro M1(Apple Silicon) で Dockerを動かす - Qiita
インストールが完了したらバージョンと動作確認。
1 | $ docker --version |
Dockerfileの作成
まずは任意の空のディレクトリを用意して、Dockerfileを用意していきます。
この記事では``railsapp``という名前の空ディレクトリを作ります。
1 | $ mkdir ~/railsapp |
docker-composeを使う場合、docker-compose.ymlがおいてあるディレクトリ名が、コンテナ名やvolume名の接頭字として使用されます。
実際の開発においては、プロジェクトの名前など、意味のあるディレクトリ名にしておいたほうが望ましいです。
また、作成したディレクトリをビルドコンテキストとするので、不要なファイルは含めないようにしましょう。
1 | FROM ruby:3.0.0 |
Dockerfileは、Railsを実行するためのファイルサーバやパッケージをイメージに含めるための定義が書かれています。ポイントだけ説明します。
FROM ruby:3.0.0
: 現時点で最新バージョンであるruby 3.0.0を指定しています。COPY . /app
はDockerファイルの置いてあるフォルダの内容をすべてコンテナ内の/app
ディレクトリにコピーしています。これはrailsのアプリケーション実行に必要なファイルをすべてコンテナの中に含めるために記載している。そのため余計なファイルを含めてしまうと、コンテナに含まれてしまうので、本記事で述べるファイル以外の関係のないファイルはおかないように注意しましょう。- 10行目〜13行目は、yarnというjsのパッケージ管理ツールをDockerコンテナ内部にインストールするためのコードです。後々、Webpackを導入するために必要となります。
Gemfileの作成
GemfileはインストールするGemを定義しておくためのファイルです。
1 | source 'https://rubygems.org' |
source
には、Gemのダウンロード元のURLを記載しています。
インストールするGemには現時点で最新バージョンであるRailsの6.0.3.4を指定しています。
このGemfileが配置されたディレクトリで、「bundle install」コマンドを実行すると、インストールが実行されるよ!
Gemfile.lockの作成
1 | $ vim Gemfile.lock |
Gemfile.lockでは空のファイルになります。通常Gemfile.lockは、直接編集するものではありません。Gemfile.lockはbundle install
を行った際に、実際にインストールしたGemのリストとバージョンが自動的に記載されるファイルです。
つまり、
1. Gemfileでinstallしたいgemを定義
2. bundle installコマンドを実行
3. gemがインストールされる
4. installしたgemがGemfile.lockに記載される
ということだね!
Gemfile.lockの用途は、別のサーバーや他の開発者のPCといった別環境で同じRailsアプリを動かす際、同じGemをインストールするために使用されます。
Gemをインストールする際は、インストールするGemを動かすために必要な別のGemも一緒にインストールしてくれます。
あるライブラリが別のライブラリを必要とすることを「依存関係」っていうんだ!
依存関係も含めて何がインストールされたのかが、全てGemfile.lockに記載されます。
このGemfile.lockを別の環境に持っていき、そこでbundle install
コマンドを実行すると、Gemfile.lockに記載された内容に従って、Gemのインストールが実行される、というわけです。
docker-compose ymlの作成
docker-compose.ymlは、Dockerで複数のコンテナを設定に従ってまとめて起動するためのファイルです。
ここでは、Railsを実行するコンテナとMySQLを実行するコンテナを起動する定義を記載します。
1 | version: '3' |
注目する点は、MySQLのimages指定です。
2021年1月時点ではタグではなくDIGESTの欄のIDを指定しないとエラーが出ます。
そして./mysql-confd:/etc/mysql/conf.d
は、MySQLのデフォルトの認証形式であるcaching_sha2_password
からmysql_native_password
に変更するファイルになります。
この設定ファイルは次のセクションで作成します。
MySQLの設定ファイルの作成
MySQLのデフォルトの認証形式をデフォルトのcaching_sha2_password
からmysql_native_password
に変更するファイルは以下のとおりです。
1 | [db] |
[db]と書かれている部分は、docker-compose.ymlファイルに記載されたデータベースのservice名に対応しています。
Rails開発環境の構築
ここまで作成した設定ファイルを使用して、Railsの開発環境を動かしていきます。
フォルダとファイルは以下のとおりです。
1 | . |
以下のコマンドを実行します。
1 | $ docker-compose run web rails new . --force --database=mysql |
ここでERROR: Service 'web' failed to build : The command '/bin/sh -c curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -' returned a non-zero code: 2
というエラーが発生しましたら、本記事の末尾のコメント欄に対応例が紹介されていますので、お手数ですがそちらをご確認ください。
処理が完了するとRailsプロジェクトのファイルが自動生成されます。
1 | /railsapp $ ls |
ここでGemfileに追記されたGemのインストールや作成されたファイルをコンテナ内に取り込むために、もう一度ビルドを実行します。
1 | $ docker-compose build |
ビルドが完了したら、Railsで使用するデータベースの設定ファイルを編集します。
ファイルはconfigディレクトリ内にあるdatabase.yml
です。
変更箇所は17行目と18行目です。
1 | # MySQL. Versions 5.5.8 and up are supported. |
ファイルを保存して、以下のコマンドを実行します。
1 | $ docker-compose up -d |
webとdbの2つのコンテナが起動状態になっていることを確認します。両方ともStateがUPになっていればOKです。
1 | $ docker-compose ps |
起動は完了しましたが、まだ開発環境用のデータベースが作成されていない状態なので、次のコマンドでデータベースを作成します。
1 | $ docker-compose run web bundle exec rake db:create |
これでうまく行けば良いですが、まれに以下のようなエラーが出てくるかと思います。
1 | Mysql2::Error::ConnectionError: Plugin caching_sha2_password could not be loaded: /usr/lib/aarch64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory |
これは、MySQL 8.0系の認証形式がcaching_sha2_password
のままになっているためです。
本来ならdefault_authentication.cnfが変えてくれるはずなんですけどね。。。
以下のように、MySQLにログインして2つのrootの認証方式をmysql_native_password
に変更します。
1 | $ docker exec -it ror_db_1 bash |
これで再び以下のコマンドを実行してください。
1 | $ docker-compose run web bundle exec rake db:create |
localhost:3000
にブラウザでアクセスするとRailsの画面が現れます。
まとめ:M1 Macにdocker-composeを用いてRailsの環境を構築する方法をまとめました。
お疲れさまでした。これでRailsの環境構築は完了です。
これからRailsの知識を着けたい方は、デイトラのRailsコースがおすすめですので、合わせてご確認ください。
教材を元に作成したサンプルアプリを改造しながらオリジナルアプリを作るのが、プログラミングスキルを向上させるコツです。
頑張ってください。
もしよろしければ、以下の記事もご確認ください。
>> 【厳選4つ】未経験におすすめのプログラミングスクール・教材! - omathin blog
参考記事
- Rails6 Webpackerでエラーが出た - Qiita
- yarnをインストールする - Qiita
- docker for macでrails × yarn × webpackerのfront環境を整える - Qiita
- dockerイメージ内にyarnをインストールする - Qiita
- MySQLの認証プラグインを変更する方法(caching_sha2_password) - Qiita
- Docker Compose と Rails(+MySQL) で開発環境作成したときに気になったポイント - Qiita
- Docker で MySQL 8.0.4 を使う - Qiita
- MySQL8.0におけるデフォルトの認証プラグインの変更 – variable.jp [データベース,パフォーマンス,運用]