Knowledge Stones

フリーランスエンジニアの技術ブログです。

Ruby 2.6.6 / Rails 6.0.3 / MySQL 8.0.19の開発環境をDockerで構築

概略

  1. Dockerfileを作成
  2. docker-compose.ymlを作成
  3. Gemfile,Gemfile.lockを作成
  4. イメージ・コンテナの作成
  5. Rails初期設定

手順

まずは、アプリケーションのルートディレクトリを作り、その中で作業しますよ。

$ mkdir my_application

Dockerfile

下記の内容でDockerfileを作成します。

# イメージのベースラインにRuby2.6.6を指定
FROM ruby:2.6.6

# Railsに必要なパッケージ等をインストール
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
RUN apt-get update -qq && apt-get install -y --no-install-recommends build-essential nodejs curl git mariadb-client yarn
RUN gem install bundler 

# ディレクトリを指定
ENV INSTALL_PATH /app
RUN mkdir $INSTALL_PATH
WORKDIR $INSTALL_PATH

# ローカルのGemfileとGemfile.lockをコピー
COPY ./Gemfile /app/Gemfile
COPY ./Gemfile.lock /app/Gemfile.lock

# Gemのインストール実行
RUN bundle install

# カレントディレクトリの内容をコピー
COPY . .

# http通信用に3000ポートを使用するっていうメモ
EXPOSE 3000

ruby2.6系をベースイメージに使ったとき、インストールするyarnのバージョンが都合悪い(?)らしく、 よくわかってないですがインストールページhttps://dl.yarnpkg.com/debian/から目的のバージョンを持ってきてます。

参考にした記事 https://qiita.com/me-654393/items/ac6f61f3eee66380ecd7

docker-compose.yml

docker-composeはこんな感じにしました。

# docker-compose.ymlフォーマットのバージョン指定
version: '3.8'
services:

  # Railsコンテナ定義
  web:
    # Dockerfileを使用してイメージをビルド
    build: .
    # ポート3000が来たらrailsサーバーが応答
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    # ローカルのsrcをコンテナにマウント
    volumes:
      - .:/app
    ports:
      - 3000:3000
    # dbコンテナが先に起動するよう設定
    depends_on:
      - mysql
    tty: true
    stdin_open: true

  # Webpackerコンテナ定義
  webpacker:
    <<: *app_base
    command: bash -c "rm -rf public/packs && bin/webpack-dev-server"
    ports:
      - 3035:3035

  # MySQLコンテナ定義
  mysql:
    # mysqlを使用してコンテナ作成
    image: mysql:8.0.19
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      # データストアからマウント
      - ./tmp/mysql:/var/lib/mysql
    # コンテナ内の環境変数を定義
    environment:
      # mysqlのルートユーザーのパスワード設定(任意のパスワード)
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    restart: always

MySQL8系を使うとき、ユーザーの認証方式が変わって"caching_sha2_password"という設定値がデフォになっているので、 開発環境としては特に拘らないので5系までと同じ設定"mysql_native_password"にしています。

Gemfile

下記のコマンドでGemfileを生成できる。

$ bundle init

Railsの目的のバージョンのみ書いておきます。

# frozen_string_literal: true

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.6'

gem 'rails', '~> 6.0.3'

Gemfile.lockは空で作っておきます。

$ touch Gemfile.lock

コンテナのビルド

あとはRailsのプロジェクトを作成して、ビルド。 できたら起動します。

$ docker-compose run web rails new . --force --database=mysql
$ docker-compose build
$ docker-compose up

Railsの初期設定

config/database.ymlを編集します。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password # ここはDockerfileに設定した値
  host: mysql # ここはdocker-compose.ymlに設定した名前

下記のコマンドでコンテナの中に入れますので、 DBを作成します。

$ docker exec -it my_application_web_1 bash
/app# bundle exec rake db:create

 実行確認

http://localhost:3000/にアクセス。 地球に人間が乗っていたらサクセス。

f:id:polar_bear_tech:20200713225142p:plain
世界征服!