【Rails6】Docker上にRailsアプリの開発環境を構築しCRUD操作する手順

rails-prograshi(プロぐらし)-kv Rails
記事内に広告が含まれていることがあります。

Dockerfileとdocker-composeから、Rails6から標準となったwebpackを使ったアプリケーションを作成する手順。

DBにはPostgreSQLを使用し、最終的にはCRUD操作まで行う。


1. ファイルの準備

プロジェクトを展開するディレクトリに移動し、以下3つのファイルを用意する。

  1. Dockerfile
  2. docker-compose.yml
  3. .dockerignore

以下作業はディレクトリrails-dockerに展開していく。

1-1. Dockerfile

Rubyをインストールする。

FROM ruby:2.7.2-alpine3.13

# Minimal requirements to run a Rails app
RUN apk add --no-cache --update build-base \
    linux-headers \
    git \
    postgresql-dev \
    nodejs \
    yarn \
    tzdata

ENV APP_PATH /usr/src/app

# Different layer for gems installation
WORKDIR $APP_PATH
ADD Gemfile $APP_PATH
ADD Gemfile.lock $APP_PATH
RUN gem list bundler
RUN gem install bundler
RUN gem list bundler
RUN bundle install

# Copy the application into the container
COPY . APP_PATH
EXPOSE 3000

1-2. docker-compose.yml

コンテナの定義。db(postgres)とweb(rails)サービスを作成する。

version: "3"
services:
  db:
    image: postgres:11.1-alpine
  web:
    build: .
    image: ruby2.7.2
    container_name: rails-web
    command: bin/rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/usr/src/app
    ports:
      - "3000:3000"
    depends_on:
      - db

1-3. .dockerignore

.dockerignoreとは?

指定したパターンにマッチするファイルを無視する。ビルド対象からの除外や、COPYADDするときにコンテナに取り込まないようにする。

OSに依存するディレクトリ(node_modulesなど)や、パスワードなどの重要な情報が入ったファイル(.envなど)を除外対象にする。

不要なファイルを除外することで、ビルドの短縮やファイルサイズの縮小ができる。

.env*
.git
.gitignore
.cache
.codeclimate.yml
.dockerignore
.gitlab-ci.yml
.hound.yml
.travis.yml
LICENSE.md
README.md
docker-compose.*
Dockerfile
log/*
node_modules/*
public/assets/*
storage/*
public/packs/*
public/packs-test/*
tmp/*

.gitignoreと.dockerignoreの違い

.gitignoreは指定したファイルをgitの追跡から無視する。役割は.dockerignoreと類似。ただし、記述方法に違いがある。

▼.dockerignoreの場合
.dockerignoreからの相対パスで記述する。例えば、

  • README.mdは指定したファイルのみ。
  • .env*は.envから始まるすべてのファイル。
  • public/packs/*はpublic > packs 配下のすべてのファイル。

任意のディレクトリを指定したい場合は**/をつける。

**/packs/*
Dockerfile リファレンス — Docker-docs-ja 24.0 ドキュメント



▼.gitignoreの場合
.dockerignoreと異なり、階層が無視される。

Dockerfile

↓ 階層に関係なく、一致するすべてのファイルが対象となる

Dockerfile
staging/Dockerfile
production/Dockerfile

2. Railsアプリの作成

rails new . --webpack --database=postgresql
  • アプリ名に現在のディレクトリ名を指定。
  • --webpack: webpackに対応させるオプション
  • --database=DB名: 使用するDBに合わせてdatabase.ymlを上書きするオプション。

(参考)database.ymlとは?



▼実行結果
最後にwebpacker installedが表示されれば完了。5分ぐらいかかる。

$ rails new . --webpack --database=postgresql

(省略)
└─ ws@6.2.1
✨  Done in 11.10s.
Webpacker successfully installed 🎉 🍰

3. database.ymlの編集

共通部分となる、default: &defaultにhostとusernameを追加する。

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  #以下追記
  host: db
  username: postgres

database.ymlはrailsでDBを作成するときの仕様書。rails db:createの時に参照される。

(参考)

4. development.rbに追記

config/environments/development.rbにyarnチェックを行わないよう設定を追記する。

  # Disable Yarn Check
  config.webpacker.check_yarn_integrity = false
end

5. dockerイメージの構築

docker-compose build

イメージがビルドされるまで5分ほど待機。

(省略)
Successfully built 2aa9de0134b5
Successfully tagged rails-docker_web:latest
#

Rubyバージョンのエラーが出た時の対処法

Gemfileのバージョンが違うと出た場合は、Gemfileを編集する。

Your Ruby version is 2.7.2, but your Gemfile specified 2.7.0
ERROR: Service 'web' failed to build : The command '/bin/sh -c bundle install' returned a non-zero code: 18

▼修正方法

ruby '2.7.0'

↓ 修正

ruby '2.7.2'

6. DBの作成とマイグレーション

database.ymlの設定を元に開発環境のDBを作成する。(環境の指定をしない場合はデフォルトで開発環境になる)

# docker-compose run --rm web bin/rails db:create
# docker-compose run --rm web bin/rails db:migrate

▼実例

$ docker-compose run --rm web bin/rails db:create
Starting rails-docker_db_1 ... done
Creating rails-docker_web_run ... done
Created database 'rails_docker_development'
Created database 'rails_docker_test'

$ docker-compose run --rm web bin/rails db:migrate
Creating rails-docker_web_run ... done

エラー対処法

ActiveRecord::ConnectionNotEstablishedという表示が出たが、一度docker-compose upでRailsサーバーを起動し、ctrl + cで修了してから再実行すると、DBが作成できた。(なぜ、、)

rails aborted!
ActiveRecord::ConnectionNotEstablished: could not translate host name "db" to address: Name does not resolve

7. コンテナ起動

docker-compose up

$ docker-compose up
rails-docker_db_1 is up-to-date
Starting rails-docker_web_1 ... done
Attaching to rails-docker_db_1, rails-docker_web_1
db_1   | 2021-04-04 01:44:46.951 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1   | 2021-04-04 01:44:46.951 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1   | 2021-04-04 01:44:46.955 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1   | 2021-04-04 01:44:46.965 UTC [19] LOG:  database system was shut down at 2021-04-04 01:12:03 UTC
db_1   | 2021-04-04 01:44:46.969 UTC [1] LOG:  database system is ready to accept connections
db_1   | 2021-04-04 01:44:50.324 UTC [1] LOG:  received smart shutdown request
db_1   | 2021-04-04 01:44:50.327 UTC [1] LOG:  background worker "logical replication launcher" (PID 25) exited with exit code 1
db_1   | 2021-04-04 01:44:50.327 UTC [20] LOG:  shutting down
db_1   | 2021-04-04 01:44:50.339 UTC [1] LOG:  database system is shut down
db_1   | 2021-04-04 01:44:54.593 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1   | 2021-04-04 01:44:54.593 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1   | 2021-04-04 01:44:54.596 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1   | 2021-04-04 01:44:54.610 UTC [21] LOG:  database system was shut down at 2021-04-04 01:44:50 UTC
db_1   | 2021-04-04 01:44:54.612 UTC [1] LOG:  database system is ready to accept connections
db_1   | 2021-04-04 01:44:59.312 UTC [28] STATEMENT:  CREATE DATABASE "rails_docker_development" ENCODING = 'unicode'
db_1   | 2021-04-04 01:44:59.324 UTC [29] STATEMENT:  CREATE DATABASE "rails_docker_test" ENCODING = 'unicode'
web_1  | => Booting Puma
web_1  | => Rails 6.1.3.1 application starting in development 
web_1  | => Run `bin/rails server --help` for more startup options
web_1  | Puma starting in single mode...
web_1  | * Puma version: 5.2.2 (ruby 2.7.2-p137) ("Fettisdagsbulle")
web_1  | *  Min threads: 5
web_1  | *  Max threads: 5
web_1  | *  Environment: development
web_1  | *          PID: 1
web_1  | * Listening on http://0.0.0.0:3000
web_1  | Use Ctrl-C to stop
http://localhost:3000/

無事プロジェクトの起動に成功。

8. CRUD操作

scaffoldでCRUD操作に必要なファイルを一括生成する。

rails g scaffold モデル名 カラム名:型,,,

実行後は$ docker-compose run --rm web rails db:migrateでマイグレーションする。

$ rails g scaffold user name:string age:integer email:string
Running via Spring preloader in process 82992
      invoke  active_record
      create    db/migrate/20210404022650_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    resource_route
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      create      test/system/users_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      create      app/views/users/_user.json.jbuilder
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss



$ docker-compose run --rm web rails db:migrate
Starting rails-docker_db_1 ... done
Creating rails-docker_web_run ... done
== 20210404022650 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0140s
== 20210404022650 CreateUsers: migrated (0.0141s) =============================

9. ブラウザ上で操作

http://localhost:3000/users 

crud.gif

新規登録、変更、削除ができている。

参考リンク

GitHub - zazk/Rails-6-Docker-Alpine: Lightweight Rails 6 App over Docker Alpine images
Lightweight Rails 6 App over Docker Alpine images. Contribute to zazk/Rails-6-Docker-Alpine development by creating an a...



以上。

タイトルとURLをコピーしました