【備忘録】M1マックでDockerを使ったRails6の環境構築[mysql]

★環境
 OS:macOS Monterey
 システムオンチップ:Apple M1
 仮想コンテナ:Docker Desktop 4.11(69879)

★構築環境
 Ruby:3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [aarch64-linux]
 Rails:6.1.4.1
 MySQL:8.0.27 for Linux on x86_64 (MySQL Community Server – GPL)

目次

必要なファイルと設定を用意

「Docker Desktop」がインストールされている事が前提です。

次に以下の必要なファイルを用意します。

・Dockerfile
・Gemfile
・Gemfile.lock
・entrypoint.sh
・docker-compose.yml

Dockerfile

FROM ruby:3.0.3
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 \
    && apt-get update -qq \
    && apt-get install -y nodejs yarn \
    && mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

Gemfile

source 'https://rubygems.org'
gem 'rails', '~>6'

Gemfile.lock

※空のファイルでOKです

entrypoint.sh

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

docker-compose.yml

version: "3.9"
services:
  db:
    platform: linux/x86_64 # M1チップ向け
    image: mysql:8.0
    volumes:
      - ./tmp/mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true

M1マック向けの記述

dbの記述で「platform: linux/x86_64」を指定しないと、M1マックではエラーになりますので、忘れずに記述します。

no matching manifest for linux/arm64/v8 in the manifest list entries.

「docker-compose up」でmysqlのイメージを使用した際のエラー

rails6をインストールする

ターミナルを起動します。

そして先程ファイルを設置したディレクトリまで移動します。

cd "ファイルを設置したディレクトリ"

「docker-compose run」でウェブサーバーを起動し、railsをインストールします。

docker-compose run --no-deps web rails new . --webpack --force --database=mysql

コンテナを再ビルド

railsのインストールでGemfileが更新されたので、コンテナを再ビルドします。

docker-compose build

「config/database.yml」の設定

生成されたrails6アプリの「config/database.yml」のデータベース設定を変更します。

データベースに接続できるように「password」と「host」を変更します。

# 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 } %>
  username: root
# パスワードとホストを指定する
#  password: 
#  host: localhost
  password: password
  host: db

development:
  <<: *default
  database: myapp_development

rails6のdocker環境を起動する

仮想コンテナを起動します。

docker-compose up

起動したらブラウザで「http://localhost:3000/」にアクセスします。

データベースが存在しないのでエラー画面になるはずです。

本当はこのエラー画面前にデータベースを作成しようと思いましたが、webの環境が構築されてないか何かのエラーが出ました。

回避する方法はあるかもしれませんが、とりあえずスマートではありませんが、今回「docker-compose up」を実行してから、データベースを作成しました。

データベースを作成する

このrails6ではデータベースを使用するので作成します。

docker-compose run web rake db:create

もう一度ウェブサーバーにアクセスすれば、インストール成功画面が表示されているはずです!

よかったらシェアしてね!
目次
閉じる