MyDocs

# docker-composeでRailsとMysqlを使う

ディレクトリ構成

./
├── Dockerfile
├── docker-compose.yml
├── db_volume/
├── mysql-confd/
│   └── default_authentication.cnf
└── src/
    ├── Gemfile
    └── Gemfile.lock

ファイルの説明

Dockerfile

Rails のアプリ用の Dockerfile を定義する。 MySQL と連携するために mysql-client をインストールしている。

FROM ruby:latest

RUN apt-get update -qq && \
    apt-get install -y build-essential && \
    apt-get install -y libpq-dev && \
    apt-get install -y mysql-client && \
    apt-get install -y nodejs

RUN mkdir /myapp
ENV APP_ROOT /myapp
WORKDIR $APP_ROOT
ADD ./src/Gemfile $APP_ROOT/Gemfile
ADD ./src/Gemfile.lock $APP_ROOT/Gemfile.lock

RUN bundle install
ADD ./src/ $APP_ROOT

docker-compose

MySQL のバージョンが 8 以上だと認証でエラーになるので設定ファイルをにマウントする。 また ./db_volume:/var/lib/mysql で DB を永続化している。

参考

version: '3'
services:
  db:
    image: mysql:latest
    volumes:
      - ./mysql-confd:/etc/mysql/conf.d
      - ./db_volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ./src:/myapp
    ports:
      - "3000:3000"
    links:
      - db

default_authentication.cnf

認証用の設定ファイル。

[mysqld]
default_authentication_plugin= mysql_native_password

Gemfile

source 'https://rubygems.org'
gem 'rails', '5.1.6'

Gemfile.lock も作成しておく ( 中身は空 ) 。

$ touch ./src/Gemfile.lock

プロジェクトの構築

$ docker-compose run web rails new . --force --database=mysql --skip-bundle

--skip-bundle で gem のインストールを回避。 実行後 ./src 配下に新しいアプリケーションが作成されている。

データベースに接続

./src/config/database.yml の password と host を docker-compose で定義した内容に変更。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: root
  host: db

dockerの起動

ビルド。

$ docker-compose build

起動。

$ docker-compose up

DBの作成

$ docker-compose run web rails db:create

確認

ブラウザで localhost:3000 にアクセス。

Rails のコンテナにアクセスして DB との接続確認。

$ docker exec -it コンテナID /bin/bash

接続したコンテナから DB に接続。

$ rails dbconsole