10
10

More than 3 years have passed since last update.

DockerでRuby2.7.x+Rails6.0.x+MySQL8.0.xな環境を構築する

Last updated at Posted at 2020-06-08

dockerにあるサンプルで作る環境はRuby2.5+Rails5+PostgreSQLと古め且つPostgreSQLだったので、
それぞれ新しいバージョンである Ruby2.7&Rails6.0&MySQL8.0の場合で書き換えたものです。
※2020年6月8日時点ではRuby2.7.1, Rails6.0.3.1, MySQL8.0.20になります

ファイルの用意

  1. Dockerfile
  2. Gemfile
  3. Gemfile.lock
  4. entrypoint.sh
  5. docker-compose.yml
  6. .env

※ docker及びdocker-composeのインストールは済んでいること
※ アプリケーションの名前はmyappとし、変更する場合は適宜置き換える

1. Dockerfileの用意

FROM ruby:2.7
# or latest

# nodejsとmysql-client (default-mysql-client) のインストール
RUN apt-get update -qq && apt-get install -y curl apt-transport-https wget nodejs default-mysql-client

# Yarn のインストール
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 yarn

RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# 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

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

2. Gemfileの用意

source 'https://rubygems.org'
gem 'rails', '~>6.0.0'

3. Gemfile.lockの用意

$ touch Gemfile.lock
  • 空ファイルを作っておかないとDockerfileで記述したCOPY Gemfile.lock /myapp/Gemfile.lockが失敗する
Step 7/14 : COPY Gemfile.lock /myapp/Gemfile.lock
ERROR: Service 'web' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder424702045/Gemfile.lock: no such file or directory

4. 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 "$@"

5. docker-compose.ymlの用意

version: '3'
services:
  db:
    image: mysql:8.0 # or lates:
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASSWORD}
    volumes:
      - db-data:/var/lib/mysql
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - ${DB_PORT}:3306
  web:
    build: .
    env_file: .env
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
      - bundle-data:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
  db-data:
  bundle-data:

6. .envの用意

DB_ROOT_PASSWORD=mysql_root_password
DB_USER=myapp
DB_PASSWORD=myapp_password
DB_PORT=3306
  • 前述のdocker-compose.ymlで参照するための値を記述

以上でファイルの用意は完了です。
ここまで記述したものがこちらになります。
https://github.com/madai0517/rails6-mysql8_docker


構築実行

rails new

$ docker-compose run web rails new . --force --no-deps --database=mysql --webpacker --skip-test
$ sudo chown -R $USER:$USER . # Linuxの場合に必要。Macでやってる場合は不要
  • DBをmysqlにするので--database=mysqlに変更。
  • MinitestではなくRspecを使うことが多いと思うので--skip-testを追加
  • --webpackerをつけ忘れた場合は後で$ docker-compose run web rails webpacker:installを実行する必要がある
  • 既にhomebrewでmysqlを導入済みでport: 3306を使用済みだとコケるので$ brew services stop mysqlで止めておくこと(mysqlの部分は適宜Formulae名に)

DBの接続設定

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  host: db

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>

起動、DBユーザーに権限の付与、DBの作成

$ docker-compose build
$ docker-compose up -d
$ docker-compose exec db mysql -uroot -p -e"GRANT ALL PRIVILEGES ON *.* TO 'myapp'@'%';FLUSH PRIVILEGES;"
$ docker-compose run web rails db:create
  • コンテナを起動後、DB_USER(この場合はmyapp)に権限を付与
    • 環境変数MYSQL_USERを参照したかったが書き方が分からなかった…

以上で環境構築は完了です。
http://localhost:3000/ にアクセスすればいつもの画面が見れるはず。
スクリーンショット 2020-06-08 3.07.23.png

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10