👻

Rails6+MySQLのDocker環境構築 (CI/CDまでの道①)

2022/01/12に公開1

はじめに

CI/CDの道ということで記事の企画が始まりました。
このシリーズではAWS初心者の私がRailsアプリケーションをDockerを用いてCI/CDするところまでを記事にしていこうと思います。

第1回はRails+MySQLのDocker環境を構築していきます。

CI/CDの道シリーズ

  • ① Rails6+MySQLのDocker環境構築

環境

  • WSL2 (Ubuntu20.04)
  • Docker 20.10.9
  • docker-compose 1.29.1
  • Git 2.25.1
  • VSCode

1. 必要なファイルの用意

この記事ではzenn_envというディレクトリを作成してその中で作業を行います。

基本的には以下の記事を参考に行っていきます。
Rails6, MySQL, alpineでローカル環境のDocker構築

まず、新規ファイル作成で以下のファイルを作成します。

Dockerfile

FROM ruby:alpine3.13
RUN apk update \
      && apk add --no-cache gcc make libc-dev g++ mariadb-dev tzdata nodejs~=14 yarn
WORKDIR /myapp
COPY Gemfile .
COPY Gemfile.lock .
RUN bundle install --jobs=2
COPY . /myapp
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]

docker-compose.yml

version: "3.9"
services:
  rails:
    build: .
    container_name: rails
    command: ash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    env_file:
      - .env
    depends_on:
      - db
  db:
    image: mysql:8.0.27
    container_name: db
    environment:
      TZ: Asia/Tokyo
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    ports:
      - "3306:3306"
    volumes:
      - db:/var/lib/mysql
volumes:
  db:

.env

DB_PASSWORD="password"

entrypoint.sh

#!/bin/sh
set -e
rm -f /myapp/tmp/pids/server.pid
exec "$@"

Gemfile

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

Gemfile.lock

Gemfile.lockは中身は空で作成のみです

ここまで行うと以下のようなディレクトリ構成になります

zenn_env
  ┣ Dockerfile
  ┣ docker-compose.yml
  ┣ .env
  ┣ entrypoint.sh
  ┣ Gemfile
  ┣ Gemfile.lock

以下のコマンドでRailsプロジェクトを作成します。

$ docker-compose run --no-deps rails bundle exec rails new . --force --database=mysql

ファイルが色々作成されました

以下のコマンドで編集権限を与えます。

$ sudo chmod -R o+w .

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

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

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>

以下のコマンドでコンテナを起動します。

$ docker-compose build
# エラーが出たら下を参照

$ docker-compose up

私の環境では以下のエラーが発生します。

db uses an image, skipping
Building rails
error checking context: 'no permission to read from '/home/jinwatanabe/workspace/zenn_env/config/master.key''.
ERROR: Service 'rails' failed to build : Build failed

こちらを参考に以下のコマンドで権限を与えます。

$ sudo chmod 764 /home/ユーザー名/workspace/ディレクトリ名/config/master.key

ユーザー名にご自身の名前をいれます。エラーと同じパスです。
私の場合は以下のコマンドになります。

$ sudo chmod 764 /home/watanabejin/workspace/zenn_web/config/master.key

成功すると以下のログが出ます。

次にDBを作成します。別のターミナルを開いて以下のコマンドでコンテナの中に入ります。

# 別のターミナルを開く
$ docker exec -it rails sh
$ rails db:create

ブラウザを開いてlocalhost:3000にアクセスします.

成功万歳!

おわりに

ここまでの作業を行ったリポジトリを以下に用意しています。
READMEに従って起動することができますのでご利用ください。

今回作成したリポジトリ

次回はWebpackerの導入にチャレンジ予定です。

参考文献

GitHubで編集を提案

Discussion

Watanabe JinWatanabe Jin

sudo chmod -R o+w .
でダメだった場合は
sudo chown -R ユーザー名:ユーザー名 ./*で試してみてください