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/ にアクセスする。
正常に起動した。
まとめ
DockerでPostgresqlのDBを起動し、RailsアプリのDBとして利用するための方法を見た。
Rails側はDocker化していないので、いずれAP側もDocker化したい。
以上