Ruby

Rails6, MySQL, alpineでローカル環境のDocker構築

久しぶりにRailsで何か作ろうと思い、とりあえずDockerでローカル環境構築したのでメモ。

構築した環境は

  • ruby:alpine3.13
  • MySQL
  • Rails6

ベースイメージに alpine 、DBをMySQLにしている点以外は、DockerのQuickStartと同じです。

Dockerについて学びたい人は「【超厳選】UdemyでDockerを学べるおすすめ講座2選」がオススメ!!

 

1. 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"]

2. docker-compose.yml作成

version: "3.9"
services:
  web:
    build: .
    container_name: myapp_web
    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.24
    container_name: myapp_db
    environment:
      TZ: Asia/Tokyo
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    ports:
      - "3306:3306"
    volumes:
      - db:/var/lib/mysql

volumes:
  db:

3. .envファイル作成

docker-compose.ymlと同じ階層に .env ファイルを作成して環境変数を定義。

DB_PASSWORD="test"

4. entrypoint.sh作成

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

 

5. Railsプロジェクト作成(rails new)

まず GemfileGemfile.lock ファイルを作成。Gemfileの中身は

source 'https://rubygems.org'

gem 'rails', '6.1.3.1'

コンテナ内で rails new してRailsプロジェクトを作成

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

6. database.yml修正

hostpassword を修正。

--- a/config/database.yml
+++ b/config/database.yml
@@ -14,8 +14,8 @@ default: &default
   encoding: utf8mb4
   pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
   username: root
-  password:
-  host: localhost
+  password: <%= ENV["DB_PASSWORD"] %>
+  host: db

 

7. ビルド、コンテナ起動

$ docker-compose build
$ docker-compose up

 

8. db:create, db:migrate

$ docker-compose run web rake db:create
$ docker-compose run web rake db:migrate

localhost:3000 にアクセスして確認!

 

【メモ】デバッグの流れ

alpine は軽量ですが色々と足りないパッケージが多いので必要なものをインストールする必要があります。

alpine 利用時に、どのパッケージを追加すれば良いか把握できていなかったので、エラーを起こしながら調べていきました。

とりあえずDockerfileとdocker-compose.yml作成

とりあえずコンテナ起動できるレベルのファイルを作成しました。

Dockerfile

FROM ruby:alpine3.13
WORKDIR /myapp
COPY Gemfile .
COPY Gemfile.lock .

docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    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"
    depends_on:
      - db
  db:
    image: mysql:8.0.24
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"

コンテナ内に入り、rails s できるまで試行錯誤

Dockerfile, docker-compose.ymlが出来たら、とりあえずコンテナ内に入ります。

$ docker-compose exec web /bin/ash

あとはbundle install, rails new を実行して、エラーを起こしながら必要なパッケージを追加していく。

 

Dockerについて学びたい人は「【超厳選】UdemyでDockerを学べるおすすめ講座2選」がオススメ!!

イチオシ記事

1

自己紹介 フリーランスエンジニアをしているヨノと申します。 独学でプログラミングを学び、ソシャゲ・SaaS開発などを経て、2018年からフリーランスエンジニアとして活動しています。 主にバックエンド中 ...

2

はじめまして、フリーランスエンジニアのヨノと申します。 自己紹介 独学でプログラミングを学び、ソシャゲ・SaaS開発などを経て、2018年からフリーランスエンジニアとして活動しています。 主にバックエ ...

3

ネット上で色々言われているフリーランスエンジニア....。「本当はどうなの?」と思っている人は多いでしょう。 そこで本記事ではフリーランスエンジニア5年生の私が、ネット上の意見も引用しながら実態を解説 ...

-Ruby