Help us understand the problem. What is going on with this article?

docker-composeでRails5.2開発環境

あちこちで解説されているdocker(compose)でRails5.2(+PostgreSQL)のサーバを立ち上げる方法です。Docker Desktopを予めインストールしておいてください(docker-composeは含まれています)。

今更な感じもありますし、これが正解ではないと思いますが、公式の手順を参考に可能な限りコマンドをシンプルにしてみました。運用していく上で結局元に戻す(コマンドを足す)可能性もありますが、まず起動して動かしてみるために公式の手順は色々やりすぎている気がしたので、極力絞った構成にしています。

(6系はyarnとwebpacker周りが複雑でまだ敬遠していますが…一応やってみました -> 記事

まず必要なファイルは2つだけです。

docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data
  web:
    build: .
    command: "rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - ./railsapp:/railsapp
    ports:
      - "3000:3000"
    depends_on:
      - db
Dockerfile
FROM ruby:2.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 /railsapp
# 後で有効化
# RUN bundle install  

上記2つのファイルを置いたディレクトリで新規プロジェクトを作成します。

mkdir railsapp
docker-compose run web rails new . --database=postgresql

少し時間がかかりますが、railsappフォルダ内に新しいファイルが生成されています。

Screen Shot 2020-03-05 at 9.08.39.png

Docker環境ではデータベースはlocalhostには存在しないため、composerで作った db に接続するよう設定を変更します。

railsapp/config/database.yml
host: db
username: postgres

次に Dockerfile の RUN bundle install の行を有効にし(コメントを外し)、buildを実行します。

docker-compose build
docker-compose up

ここまでで、Webサーバが立ち上がった状態になっていますが、データベースの初期化が必要です。別のターミナルを立ち上げて以下を実行します(execはコンテナが立ち上がった(=upされた)状態でコマンドを実行するサブコマンドです)。

docker-compose exec web rails db:create

ここまで実行したらブラウザで「localhost:3000」にアクセスするとRailsの最初のページが見えているはずです。

Screen Shot 2020-02-11 at 21.25.28.png

同じ要領で、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

Screen Shot 2020-02-11 at 21.34.54.png

補足1

デフォルトのGemfileは、bundle install後に色々警告が出てしまいます。警告の内容に従って新しいgemに差し替えています。

Gemfile
# 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

関連記事

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした