はじめに
この記事では11/22現在、DockerでRuby on Railsの環境を構築する方向けの内容です。完成したものはGithubにてソースコードを公開しています。
またDockerをインストールする手順は、
上の動画に従うことで構築することができると思います。
以下、ソースコードの多くは他の方のものを使っております。予めご了承ください。(参考文献は載せてあります。)
各種バージョン
下記のバージョンで作業を行いました。
・OS Windows11
・Ruby 2.7
・Ruby on Rails 6.1.4
・MySQL 8.0
・docker 20.10.10
・docker-compose 2.1.1
・Visual Studio Code 1.62.3
・Ubuntu 20.04 LTS
手順
- Docker Engineの設定を変更
- ファイルの作成
- アプリを作成する
- イメージをビルドする
- データベースを接続する
- コンテナを起動、停止する
1. Docker Engineの設定を変更
今回ここの設定が一番キーになると思います。
まずDocker Desktopを開いてください。右上に歯車マークをクリックし、Docker Engineを選択すると、コードを変更できます。
{
"debug": false,
"experimental": false,
"features": {
"buildkit": true
},
"insecure-registries": [
"docker.io"
],
"registry-mirrors": []
}
上のコードを入力したら、右下にあるApply & Restartをクリックして変更を適応します。
2. ファイルの作成
今回追加するファイルは5つあります。ディレクトリに追加してください。
・Dockerfile
・docker-compose.yml
・Gemfile
・Gemfie.lock
・entrypoint.sh
それぞれの中身を以下のように変更してください。
Dockerfile
FROM ruby:2.7
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt-get update -qq \
&& apt-get install -y nodejs yarn \
&& mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
docker-compose.yml
version: '3'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
ports:
- '3306:3306'
command: --default-authentication-plugin=mysql_native_password
volumes:
- mysql-data:/var/lib/mysql
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
stdin_open: true
tty: true
volumes:
mysql-data:
driver: local
※もしMacをお使いの方で、M1チップを搭載の方は
db:
platform: linux/x86_64 <-こちらを追記してください
image: mysql:8.0
M1チップに対応のために必要になります。
Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 6.1.4'
Gemfile.lock
こちらには何も記入しなくて大丈夫です。
entrypoint.sh
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
以上でファイルの作成は終了です。
もしターミナルを起動していたら、一度ターミナルを落としておいたほうがいいかもしれません。
3. アプリを作成する
5つのファイルが作成できたら、ターミナルを起動しましょう。下記のコードを入力して、アプリを作成します。
$ docker-compose run web rails new . --force --no-deps --database=mysql
4. イメージをビルドする
上記の工程が完了しましたら、Gemfile が更新されているはずです。よって、イメージをビルドする必要があります。
$ docker-compose build
5. データベースと接続する
データベースと接続するためにconfig/database.yml を編集します。
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %>
host: <%= ENV.fetch("MYSQL_HOST", "db") %>
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
production:
<<: *default
database: myapp_production
username: myapp
password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
続いて、データベースを作成します。ターミナルで以下のコードを実行してください。
$ docker-compose run web rake db:create
6. コンテナ起動、停止する
ターミナルにて、下記のコードを実行します。
$ docker-compose up
ブラウザを開いて
localhost:3000
にアクセスすると、下の画面と同じようになるはずです。
これで、Rails6をDocker+MySQLで環境構築が完了しました!!お疲れさまでした!!(長かったと思います..)
終了するときは,
Ctrl + C
もしくは、ターミナルにて下記のコードを実行します。
$ docker-compose down
そうすると、ダウンすることができます。
最後に
もし実行できない方がいらっしゃいましたら、完成したものはGithubにてソースコードを公開しておりますので、お手数おかけしますが、確認していただけると幸いです。
何度かDockerで環境構築しましたが、なかなかうまくいかず苦戦しました。そこで原因を洗い出し、Docker Engineの設定が足りないことに気づきました。(必ず同じ箇所でエラーが起きて、やっと気づきました。)
もし参考にしていただけると非常にうれしいです。手順のミスやタイピングミスなどありましたら、ご連絡ください。ここまでご覧いただき、誠にありがとうございました。今回Qiitaに初めて投稿をさせていだたき、記事を書く大変さを認識しました。
参考文献
・https://qiita.com/nsy_13/items/9fbc929f173984c30b5d
・https://zenn.dev/hiszuk/articles/cb30071df19a1b4f8365