おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

Dockerを使って「Rails / PostgreSQL」の開発環境を作ろう!

Dockerを使ってRuby on Railsの開発環境を作成する方法の紹介です。

こちら公式の手順になるのですが、Rubyのバージョンが2.5だったので今回2.6でチャレンジしてみます。

docs.docker.com

基本は公式通りで問題ないですが、2.6でrails newするとRails6系がインストールされます。Rails6系ではWebpackerが自動でインストールされる影響でそれを利用するためのyarnをインストールする必要があります。

Rails 6の変更点と新機能 | RE:ENGINES

【Rails入門】Webpackerではじめるフロントエンド開発!Rails5.1対応 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

今回作成する環境

  • Ruby: 2.6.5
  • Rails: 6.0.0
  • PostgreSQL: 12.0

環境構築

Gemfile作成

source 'https://rubygems.org'
gem 'rails'

合わせて空のGemfile.lockも作成しておきます。

Dockerfile作成

Railsアプリを作成するために必要な各種設定を記述するファイルです。

上から順番に処理されていくようなイメージですね。

FROM ruby:2.6

# `apt-get install yarn`とするとえらーになるので、以下ように。
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
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 && apt-get install -y yarn


RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
  • RUN: コマンドの実行
  • WORKDIR: 作業ディレクトリ
  • COPY: ファイルのコピー
  • CMD: コンテナコマンドの実行

RUNとCMSの違いはこちら

entrypoint.sh

server.pidが存在するときに削除するシェルファイルです。これも作成しないとエラーになりました。

#!/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作成

こちらはアプリケーションを構成するサービス(web / DB)、各サービスの取得方法やポート番号など全体の構成を定義するファイルです。

version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  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

rails作成

docker-compose run web rails new . --force --no-deps --database=postgresql
docker-compose build

postgresql設定

元々色々書かれていますが、一度全て消して以下だけにします。

# database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password:
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test

DBを作成します。

docker-compose run web rake db:create

アプリを起動する

ここまでで設定は完了です。

docker-compose up

localhost:3000でRailsのウェルカムページが表示されていればokです!

その他のこと

vueをインストールする

docker-compose run web rails webpacker:install
docker-compose run web rails webpacker:install:vue
docker-compose build
docker-compose up

typescriptをインストールする

$ docker-compose run web rails webpacker:install:typescript

webpacker:installするとエラーになる

apt-get install yarnとすると、エラーになりました。

$ docker-compose run web rails webpacker:install
Starting docker-sample_db_1 ... done
rails aborted!
ArgumentError: Malformed version number string 0.32+git
/usr/local/bundle/gems/webpacker-4.0.7/lib/tasks/webpacker/check_yarn.rake:12:in `block (2 levels) in <main>'
/usr/local/bundle/gems/railties-6.0.0/lib/rails/commands/rake/rake_command.rb:23:in `block in perform'
/usr/local/bundle/gems/railties-6.0.0/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/usr/local/bundle/gems/railties-6.0.0/lib/rails/command.rb:48:in `invoke'
/usr/local/bundle/gems/railties-6.0.0/lib/rails/commands.rb:18:in `<main>'
/usr/local/bundle/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require'
/usr/local/bundle/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `block in require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
/usr/local/bundle/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
/usr/local/bundle/gems/activesupport-6.0.0/lib/active_support/dependencies.rb:325:in `block in require'
/usr/local/bundle/gems/activesupport-6.0.0/lib/active_support/dependencies.rb:291:in `load_dependency'
/usr/local/bundle/gems/activesupport-6.0.0/lib/active_support/dependencies.rb:325:in `require'
/myapp/bin/rails:9:in `<top (required)>'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client/rails.rb:28:in `load'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client/rails.rb:28:in `call'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client/command.rb:7:in `call'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client.rb:30:in `run'
/usr/local/bundle/gems/spring-2.1.0/bin/spring:49:in `<top (required)>'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `load'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `<top (required)>'
/myapp/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => webpacker:install => webpacker:check_yarn
(See full trace by running task with --trace)

なんか分からないけど、yarnのバージョンが何かがおかしい... なので、yarnのinstall方法を変更します。

# Dockerfile
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
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 && apt-get install -y yarn

これど再度docker-compose buildしてやると上手くいきました。