あちこちで解説されているdocker(compose)でRails5.2(+PostgreSQL)のサーバを立ち上げる方法です。Docker Desktopを予めインストールしておいてください(docker-composeは含まれています)。
今更な感じもありますし、これが正解ではないと思いますが、公式の手順を参考に可能な限りコマンドをシンプルにしてみました。運用していく上で結局元に戻す(コマンドを足す)可能性もありますが、まず起動して動かしてみるために公式の手順は色々やりすぎている気がしたので、極力絞った構成にしています。
(6系はyarnとwebpacker周りが複雑でまだ敬遠していますが…一応やってみました -> 記事)
インストール
まず必要なファイルは2つだけです。
version: '3'
services:
db:
image: postgres
environment:
POSTGRES_PASSWORD: secret
volumes:
- ./postgresql/data:/var/lib/postgresql/data
web:
build:
context: .
dockerfile: docker-web
command: "rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/railsapp
ports:
- "3000:3000"
depends_on:
- db
FROM ruby:2.6.6
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN gem install rails -v "~> 5.2" -N
RUN mkdir /railsapp
WORKDIR /railsapp
COPY . /railsapp
# 後で有効化
# RUN bundle install
上記2つのファイルを置いたディレクトリで新規プロジェクトを作成します。
docker-compose run web rails new . --database=postgresql
少し時間がかかりますが、rails関連の新しいファイルが生成されています。
Docker環境ではデータベースはlocalhostには存在しないため、composerで作った db に接続するよう設定を変更します。
host: db
username: postgres
password: secret
次に Dockerfile の RUN bundle install
の行を有効にし(コメントを外し)、buildを実行します。
docker-compose build
docker-compose up
ここまでで、Webサーバが立ち上がった状態になっていますが、データベースの初期化が必要です。別のターミナルを立ち上げて以下を実行します(execはコンテナが立ち上がった(=upされた)状態でコマンドを実行するサブコマンドです)。
docker-compose exec web rails db:create
ここまで実行したらブラウザで「localhost:3000」にアクセスするとRailsの最初のページが見えているはずです。
同じ要領で、scaffoldを作成したり、ここからはいつものrailsのノリで作業が出来そうです(先頭のdocker-compose exec web
を外すと普通のRailsコマンドです)。
docker-compose exec web rails g scaffold post title:string body:text published:boolean
docker-compose exec web rails db:migrate
補足1
デフォルトのGemfileは、bundle install後に色々警告が出てしまいます。警告の内容に従って新しいgemに差し替えています。
# gem 'sass-rails', '~> 5.0'
# ↓ 変更
gem 'sassc-rails'
# gem 'chromedriver-helper'
# ↓ 変更
gem 'webdrivers'
開発がDocker(linux)ならWindowsのお世話になることはありませんので、以下は削除してしまいます。参考記事
# 削除
# gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
rubyの2.7を使いたかったのですが、Pumaの起動時に警告が大量に出るため、2.6を使用しています。
/usr/local/bundle/gems/activemodel-5.2.4.1/lib/active_model/translation.rb:67: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
補足2
dockerは"軽量"と言われていますが、何回も試していると意外とディスクを圧迫してきます。時々不要なものは削除すると良いでしょう。以下は開発環境でがさっと削除する場合の例です。
$ docker ps -a | awk '{print $1}' | xargs docker rm
$ docker images | grep none | awk '{print $3}' | xargs docker rmi
2020.08.12追記
以下のコマンドも役に立ちます 参考記事
docker system prune
補足3
元々は、railsプロジェクトはrailsappサブディレクトリに収める作りにしていたのですが、heroku+githubの連携と相性が悪かったため、プロジェクト直下に配置するように調整しています。