LoginSignup
8
7

More than 3 years have passed since last update.

Rails 6.0 × MySQL8でDocker環境構築(Alpineベース)

Posted at

はじめに

Dockerについての知識を深めるため、表記の環境構築をしました。

※当環境は開発環境を想定して構築しています。また、不具合等で後日記事を修正する可能性がありますので、予めご了承下さい。

概要

構成のベースは、主に下記の記事を参考にしました。

DockerでRails+Webpackerの開発環境を構築するテンプレート

Rails6ではwebpackerが標準で備わっているため、webpacker導入の記事を参考にしました。

当環境の特徴は、
・DockerイメージをAlpine Linuxベースを使用し、軽量化。
・マルチステージビルド機能を使用し、Nodeイメージから実行ファイルをコピーしてくることで、ビルド時間短縮、軽量化。
・Entrykitのコマンド「prehook」を使用し、コンテナ起動時にbundle installすることで、作業効率向上。
です。各項目の参考URLを下記に記載します。

Alpine Linux で Docker イメージを劇的に小さくする
Multi-stage build でNode.jsのインストールをちょっぴり効率化する
RailsのDocker環境にEntrykitを導入し、bundle installを自動実行させる方法

開発環境

・MacOS Mojave 10.14.6
・Ruby 2.6.5
・Rails 6.0.0
・Docker 19.03.1
・Docker compose ver.1.24.3

各種ファイル

Dockerfile.dev

# nodeイメージをビルド
FROM node:13.1.0-alpine as node

# 軽量のAlpine Linuxベースのイメージ
FROM ruby:2.6.5-alpine3.10

# rails consoleの中で日本語入力を設定
ENV LANG C.UTF-8

# 環境構築に必要なパッケージをインストール
RUN apk add --no-cache alpine-sdk \
    mysql-client \
    mysql-dev \
    build-base \
    bash \
    tzdata

# Dockerコンテナ起動時の実行タスクを処理するためのツール
ENV ENTRYKIT_VERSION 0.4.0

# entrykitインストール
RUN wget https://github.com/progrium/entrykit/releases/download/v${ENTRYKIT_VERSION}/entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \
    && tar -xvzf entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \
    && rm entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \
    && mv entrykit /bin/entrykit \
    && chmod +x /bin/entrykit \
    && entrykit --symlink

# javascriptパッケージマネージャ
ENV YARN_VERSION 1.19.1

# MSBで、ビルドしたnodeイメージからyarnとnodeをコピー
COPY --from=node /opt/yarn-v$YARN_VERSION /opt/yarn
COPY --from=node /usr/local/bin/node /usr/local/bin/

# dockerイメージから参照できる様シンボリックリンク作成
RUN ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn \
    && ln -s /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg

# ディレクトリ作成
RUN mkdir /app

# 作業フォルダとして設定
WORKDIR /app

# entrykitのコマンド設定
ENTRYPOINT [ \
    "prehook", "ruby -v", "--", \
    "prehook", "bundle install -j3 --quiet", "--"]

docker-compose.yml

# docker-compose最新(2019.11.12現)Ver.
version: "3.7"

# アプリケーションを動かすための各要素
services:

  app: &app_base      # rails server用コンテナ
    build:            # Dockerfileを実行し、ビルドされる時のパス指定
      context: .
      dockerfile: Dockerfile.dev
    volumes:          # マウントする設定ファイルのパス指定
      - .:/app
      - bundle-data:/usr/local/bundle
    ports:            # port番号(docker:host)
      - "3000:3000"
    depends_on:       # Service同士の依存関係
      - db
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    tty: true         # railsのデバッグを使用するための設定
    stdin_open: true  # 同上

  webpack:            # webpack-dev-server用コンテナ
    <<: *app_base
    command: "bin/webpack-dev-server"
    ports:
      - "3035:3035"
    depends_on:
      - app
    tty: false
    stdin_open: false

  db:           # データベース用コンテナ
    image: mysql:8.0.18
    command: --default-authentication-plugin=mysql_native_password # ユーザーの認証方式変更
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "4306:3306"
    volumes:
      - "mysql-data:/var/lib/mysql"

volumes:
  mysql-data:
    driver: local
  bundle-data:
    driver: local

説明についてはコメントアウトの通りです。
また、Mysql8ではユーザーの認証方式がcaching_sha2_passwordに変わっているみたいで、現環境だと対応するのが厳しいため、一時的に5.7までの認証方式であるmysql_native_passwordに変更しています。
他、基本的には参考サイトと構成は同じです。

注意すべき点はrails newの後、database.ymlwebpacker.ymlの変更を忘れないことです。

database.yml

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

webpacker.yml

dev_server:
    https: false
    host: webpack
    port: 3035
    public: localhost:3035
    hmr: false

データベースのパスワードはdocker-compose.ymlに記載したパスを、両ファイルのhostにはそれぞれのコンテナ名を記載してください。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7