はじめに
久しぶりにRailsアプリを作ることになり、今回はデータベースにDockerのPostgresを使おうと思ったので、そのときの構築方法をメモ。
Mac上の環境情報は以下の通り。
$ ruby -v ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin17] $ rails -v Rails 5.2.2 $ docker -v Docker version 18.09.0, build 4d60db4
また、Railsアプリ名は今回はrails-hogeとする。
Dockerのpostgres準備
まず、Postgresの公式のDockerイメージをpullする。
$ docker image pull postgres
Dockerイメージを起動しPostgres DB(バージョンは最新の11.1)を作成する。
このあとrails-hogeというプロジェクト名でrailsアプリを作るが、database.ymlの開発環境DB名はデフォルトでrails-hoge_developmentとなるため、作成するDB名はそれに合うようにPOSTGRES_DB=rails-hoge_development環境変数をセットしておく。
ユーザ名とパスワードは適当にdevとしておく。
$ docker run --name rails-hoge-db -p 5432:5432 -e POSTGRES_DB=rails-hoge_development -e POSTGRES_USER=dev -e POSTGRES_PASSWORD=dev -d postgres:11.1 $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ecd8a26c8be9 postgres:11.1 "docker-entrypoint.s…" 10 seconds ago Up 8 seconds 0.0.0.0:5432->5432/tcp rails-hoge-db
DBに接続確認する。
$ export PGPASSWORD=dev
$ psql -h localhost -d rails-hoge_development -U dev
psql (11.1)
Type "help" for help.
rails-hoge_development=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
dev | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
rails-hoge_development=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
------------------------+-------+----------+------------+------------+-------------------
postgres | dev | UTF8 | en_US.utf8 | en_US.utf8 |
rails-hoge_development | dev | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | dev | UTF8 | en_US.utf8 | en_US.utf8 | =c/dev +
| | | | | dev=CTc/dev
template1 | dev | UTF8 | en_US.utf8 | en_US.utf8 | =c/dev +
| | | | | dev=CTc/dev
(4 rows)
rails-hoge_development=# \qDBは問題なく作成されている。
railsプロジェクト作成
rails newでpostgresql用のプロジェクトを作成する
$ rails new rails-hoge -d postgresql $ cd rails-hoge $ ls Gemfile README.md app config db log public test vendor Gemfile.lock Rakefile bin config.ru lib package.json storage tmp
config/database.ymlファイルをDockerのpostgresの接続情報に合わせて下記のように修正する。
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: rails-hoge_development
username: dev
password: dev
host: localhost
port: 5432
test:
<<: *default
database: rails-hoge_test
production:
<<: *default
database: rails-hoge_production
username: rails-hoge
password: <%= ENV[‘RAILS-HOGE_DATABASE_PASSWORD'] %>Railsサーバの起動確認する。
(本環境ではたまたま別アプリがポート3000をすでに使っていたので3001に変えた)。
$ rails s -p 3001 /Users/dev/.rbenv/versions/2.5.3/lib/ruby/2.5.0/fileutils.rb:90: warning: already initialized constant FileUtils::VERSION /Users/dev/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:92: warning: previous definition of VERSION was here /Users/dev/.rbenv/versions/2.5.3/lib/ruby/2.5.0/fileutils.rb:1188: warning: already initialized constant FileUtils::Entry_::S_IF_DOOR /Users/dev/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1267: warning: previous definition of S_IF_DOOR was here /Users/dev/.rbenv/versions/2.5.3/lib/ruby/2.5.0/fileutils.rb:1446: warning: already initialized constant FileUtils::Entry_::DIRECTORY_TERM /Users/dev/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1541: warning: previous definition of DIRECTORY_TERM was here /Users/dev/.rbenv/versions/2.5.3/lib/ruby/2.5.0/fileutils.rb:1448: warning: already initialized constant FileUtils::Entry_::SYSCASE /Users/dev/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1543: warning: previous definition of SYSCASE was here /Users/dev/.rbenv/versions/2.5.3/lib/ruby/2.5.0/fileutils.rb:1501: warning: already initialized constant FileUtils::OPT_TABLE /Users/dev/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1596: warning: previous definition of OPT_TABLE was here /Users/dev/.rbenv/versions/2.5.3/lib/ruby/2.5.0/fileutils.rb:1555: warning: already initialized constant FileUtils::LOW_METHODS /Users/dev/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1650: warning: previous definition of LOW_METHODS was here /Users/dev/.rbenv/versions/2.5.3/lib/ruby/2.5.0/fileutils.rb:1562: warning: already initialized constant FileUtils::METHODS /Users/dev/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1657: warning: previous definition of METHODS was here => Booting Puma => Rails 5.2.2 application starting in development => Run `rails server -h` for more startup options Puma starting in single mode... * Version 3.12.0 (ruby 2.5.3-p105), codename: Llamas in Pajamas * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://localhost:3001 Use Ctrl-C to stop
fileutils.rb のWarningが出ている。
下記サイトを参考にfileutilsをdefaultバージョンでインストールしなおす。
参照: https://stackoverflow.com/questions/51334732/rails-5-2-0-with-ruby-2-5-1-console-warning-already-initialized-constant
$ gem list | grep fileutils fileutils (1.1.0, default: 1.0.2) $ gem uninstall fileutils Successfully uninstalled fileutils-1.1.0 $ gem update fileutils --default Updating installed gems Updating fileutils Fetching fileutils-1.1.0.gem Successfully installed fileutils-1.1.0 Done installing documentation for fileutils after 0 seconds Done installing documentation for fileutils after 0 seconds Gems updated: fileutils $ gem list | grep fileutils fileutils (default: 1.1.0, default: 1.0.2)
Railsサーバを再起動する。
$ rails s -p 3001 => Booting Puma => Rails 5.2.2 application starting in development => Run `rails server -h` for more startup options Puma starting in single mode... * Version 3.12.0 (ruby 2.5.3-p105), codename: Llamas in Pajamas * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://localhost:3001 Use Ctrl-C to stop
Warningはなくなったので、http://localhost:3001/ にアクセスする。

正常に起動した。
まとめ
DockerでPostgresqlのDBを起動し、RailsアプリのDBとして利用するための方法を見た。
Rails側はDocker化していないので、いずれAP側もDocker化したい。
以上