カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまに数学やデータ分析なども。

Mac上でDockerのPostgres 11.1を使ってRails 5.2アプリを作成したときのメモ

はじめに

久しぶりに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=# \q

DBは問題なく作成されている。

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/ にアクセスする。
f:id:osn_th:20181229133205p:plain
正常に起動した。

まとめ

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

以上