Dockerfileとdocker-composeから、Rails6から標準となったwebpackを使ったアプリケーションを作成する手順。
DBにはPostgreSQLを使用し、最終的にはCRUD操作まで行う。
1. ファイルの準備
プロジェクトを展開するディレクトリに移動し、以下3つのファイルを用意する。
- Dockerfile
- docker-compose.yml
- .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とは?
指定したパターンにマッチするファイルを無視する。ビルド対象からの除外や、COPY
やADD
するときにコンテナに取り込まないようにする。
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/*
▼.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
無事プロジェクトの起動に成功。
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
新規登録、変更、削除ができている。
参考リンク
以上。