Rails 6✖️MySQLで作成したアプリに途中からDockerを導入する方法


はじめに

ポートフォリオの開発環境にDockerを導入するにあたり、多くの記事を参考にさせていただきました。
しかし、その多くが作成の初期段階から導入する方法であったり、バージョンや使用データベースに違いがあったりで、苦戦しました。
改善箇所はあるかと思いますが、なんとかエラーなく起動することができたのでメモとして残しておきます。

環境

・macOS Catalina
・Ruby:2.6.5
・Rails:6.0.3
・MySQL:5.6

手順

1.DockerをMacにインストールする
2.各種ファイルを新しく用意して編集する
3.database.ymlの編集
4.コンテナをbuildする
5.Dockerコンテナ上にデータベースを作成
6.コンテナを起動する

1.DockerをMacにインストールする

Dockerをインストールし、画面右上にクジラのアイコンが出ている状態にします。

2.各種ファイルを用意・編集

下記の3つのファイルを新規で作成します。
・Dockerfile
・docker-compose.yml
・entrypoint.sh

作成したファイルに記述していきます。
※アプリ名をいれる箇所は仮でアプリ名としています。
・Dockerfile

Dockerfile
FROM ruby:2.6.5
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
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn


WORKDIR /アプリ名
COPY Gemfile /アプリ名/Gemfile
COPY Gemfile.lock /アプリ名/Gemfile.lock
RUN gem install bundler
RUN bundle install
COPY . /アプリ名

RUN yarn install --check-files
RUN bundle exec rails webpacker:compile

# Add a script to be executed every time the container starts.
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

docker-compose.yml

version: "3"
services:
  db:
    image: mysql:5.6
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    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:
      - .:/アプリ名
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
    environment:
      - MYSQL_HOST=db
      - MYSQL_PASSWORD=password
volumes:
  mysql-data:
    driver: local

・entrypoint.sh

entrypoint.sh

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /アプリ名/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

3.database.ymlの編集

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: <%= ENV['MYSQL_PASSWORD'] || '' %>
  socket: /tmp/mysql.sock
  host: <%= ENV['MYSQL_HOST'] || 'localhost' %>

4.イメージをbuildする

 docker-compose build

5.Dockerコンテナ上にデータベースを作成

$ docker-compose run web bundle exec rake db:create
$ docker-compose run web bundle exec rake db:migrate

6.コンテナを起動する

$ docker-compose up 

最後に

これでlocalhost3000にてアクセスできます。

参考

Ruby on Rails 「途中まで作ったアプリにDockerを導入したい」に挑戦してみる(MySQL / Sequel Pro)
【Rails】Rails 6.0 x Docker x MySQLで環境構築
【Rails環境構築】Docker + Rails + Mysql
DockerでRuby on Railsの環境構築を行うためのステップ【Rails 6対応】
Rails 6 + MySQLの環境構築をDocker composeで作る