./
├── Dockerfile
├── docker-compose.yml
├── db_volume/
├── mysql-confd/
│ └── default_authentication.cnf
└── src/
├── Gemfile
└── Gemfile.lock
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
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
認証用の設定ファイル。
[mysqld]
default_authentication_plugin= mysql_native_password
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-compose build
起動。
$ docker-compose up
$ docker-compose run web rails db:create
ブラウザで localhost:3000 にアクセス。
Rails のコンテナにアクセスして DB との接続確認。
$ docker exec -it コンテナID /bin/bash
接続したコンテナから DB に接続。
$ rails dbconsole