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