BETA

ruby 2.6 + alpine 3.8 + Rails 5.2 + Docker + docker-compose + mysql 5.6 開発環境構築

投稿日:2019-01-04
最終更新:2019-01-04

Dockerfileの準備

下記Dockerfileを準備

FROM ruby:2.6-alpine3.8  

ENV APP_ROOT /usr/src/app  

WORKDIR $APP_ROOT  

RUN apk add --no-cache alpine-sdk \  
    nodejs-current \  
    nodejs-npm \  
    yarn \  
    mysql-client \  
    mysql-dev \  
    python2 \  
    tzdata

ruby2.6、alpine3.8で構築。webpakcerが入れられるようにnodeとyarn入り。
mysqlを使っていくのでmysql関連のパッケージも追加済み。
python2はnodeが依存しているため追加している。

docker-compose.ymlの準備

下記docker-compose.ymlを準備

version: '2'  
services:  
  mysql-development:  
    image: mysql:5.6  
    environment:  
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"  
      MYSQL_USER: app  
      MYSQL_PASSWORD: app  
      MYSQL_DATABASE: app_development  
      TZ: Asia/Tokyo  
    expose:  
      - '3306'  
    volumes:  
      - mysql-development-data:/var/lib/mysql  
      - ./mysql5.6:/etc/mysql/conf.d  

  mysql-test:  
    image: mysql:5.6  
    environment:  
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"  
      MYSQL_USER: app  
      MYSQL_PASSWORD: app  
      MYSQL_DATABASE: app_test  
      TZ: Asia/Tokyo  
    expose:  
      - '3306'  
    volumes:  
      - mysql-test-data:/var/lib/mysql  
      - ./mysql5.6:/etc/mysql/conf.d  


  app:  
    tty: true  
    stdin_open: true  
    build:  
      context: .  
      dockerfile: Dockerfile  
    environment:  
      BUNDLE_JOBS: 4  
      BUNDLE_PATH: /usr/src/app/vendor/bundle  
    command: bin/server  
    ports:  
      - '13000:3000'  
    volumes:  
      - .:/usr/src/app  
      - bundle-data:/usr/src/app/vendor/bundle  
      - node_modules-data:/usr/src/app/node_modules  
      - log-data:/usr/src/app/log  
    links:  
      - mysql-test  
      - mysql-development  

volumes:  
  mysql-development-data:  
    driver: local  
  mysql-test-data:  
    driver: local  
  bundle-data:  
    driver: local  
  node_modules-data:  
    driver: local  
  log-data:  
    driver: local

コンテナの3000番ポートをホストの13000番ポートに割り当てているため、13000番ポートにアクセスすることでブラウザで表示させることができる。

Gemfileの準備

下記Gemfileを準備

source 'http://rubygems.org'  
gem 'rails', '5.2.0'

Gemfile.lockの準備

空のGemfile.lockを準備

Railsプロジェクトの作成

上記ファイルをすべてプロジェクト用のディレクトリ直下に置いて下記コマンドを実行

docker-compose run --rm app bundle install  
docker-compose run --rm app bundle exec rails new . --force --database=mysql

bin/serverの準備

docker-composeのcommandに直接記述すると長くなるので、bin/serverに下記内容を記述し、パーミッションを変更して、commandからbin/serverを呼び出すようにしておく。

#!/usr/bin/env ruby  
require 'pathname'  
require 'fileutils'  
include FileUtils  

# path to your application root.  
APP_ROOT = Pathname.new File.expand_path('..', __dir__)  

def system!(*args)  
  system(*args) || abort("\n== Command #{args} failed ==")  
end  

chdir APP_ROOT do  
  puts "\n== Removing pid =="  
  system! 'rm -f /usr/src/app/tmp/pids/server.pid'  

  puts "\n== Installing Gems =="  
  system! 'bin/bundle install'  

  puts "\n== Installing JavaScript dependencies =="  
  system! 'bin/yarn install'  

  puts "\n== Starting server =="  
  system! 'bundle exec rails s -b 0.0.0.0 -p 3000'  
end

DB周りの設定追記

config/database.ymlを下記のように変更

# MySQL. Versions 5.1.10 and up are supported.  
#  
# Install the MySQL driver  
#   gem install mysql2  
#  
# Ensure the MySQL gem is defined in your Gemfile  
#   gem 'mysql2'  
#  
# And be sure to use new-style password hashing:  
#   https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html  
#  
default: &default  
  adapter: mysql2  
  encoding: utf8mb4  
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>  
  host: localhost  
  username: root  
  password:  
  charset: utf8mb4  
  collation: utf8mb4_bin  

development:  
  <<: *default  
  database: app_development  
  username: app  
  password: app  
  host: mysql-development  

# Warning: The database defined as "test" will be erased and  
# re-generated from your development database when you run "rake".  
# Do not set this db to the same as development or production.  
test:  
  <<: *default  
  database: app_test  
  username: app  
  password: app  
  host: mysql-test  

# As with config/secrets.yml, you never want to store sensitive information,  
# like your database password, in your source code. If your source code is  
# ever seen by anyone, they now have access to your database.  
#  
# Instead, provide the password as a unix environment variable when you boot  
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database  
# for a full rundown on how to provide these environment variables in a  
# production deployment.  
#  
# On Heroku and other platform providers, you may have a full connection URL  
# available as an environment variable. For example:  
#  
#   DATABASE_URL="mysql2://myuser:[email protected]/somedatabase"  
#  
# You can use this database configuration with:  
#  
#   production:  
#     url: <%= ENV['DATABASE_URL'] %>  
#  
production:  
  <<: *default  
  database: app_production  
  username: app  
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>

mysql5.6/my.cnfに下記を追加

[client]  
default-character-set=utf8mb4  

[server]  
character-set-server = utf8mb4  

[mysqld]  
collation-server=utf8mb4_bin  
character-set-server=utf8mb4  
innodb-file-format=barracuda  
innodb_file_format_max=barracuda  
innodb-file-per-table=1  
innodb_large_prefix=1

動作確認

docker-compose up

上記コマンドを実行して、下記のような画面が表示されればとりあえず問題ないはず。

下記リポジトリに生成済みのものを置いておく。
https://github.com/hiko1129/rails-example/tree/add_rails_project

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

hiko1129の技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう