rails + postgresQL + Docker-composeで環境構築したった

herokuにデプロイしたくて、クレジットカード登録するのめんどくさくて、postgresQL入門しました。

事前準備

mkdir myapp  # 好きな名前でどうぞ
cd myapp  
gem install rails
rails new example_app  -d postgresql # 好きな名前でどうぞ

myappディレクトリに以下のファイルを追加 ( app, bin, config などと同列に置く )

Dockerfile

FROM ruby:2.4-alpine

ENV LANG C.UTF-8
ENV HOME /app

WORKDIR $HOME

COPY Gemfile $HOME
COPY Gemfile.lock $HOME

RUN apk update -qq && apk add --no-cache build-base tzdata libxml2-dev libxslt-dev alpine-sdk postgresql-dev nodejs
RUN bundle install

EXPOSE 3000

Dockerfileはこんな感じです。似たような記事の dockerファイルを見ると、

RUN apt-get install -y build-essential libpq-dev

とか書かれたりしてて、こっちはUbuntuベースのdockerファイルだそうですね。今回のはalpine-linuxベースのdockerファイルで、なんでも容量が劇的に小さくなるそう。node.jsが入ってるのは僕がこの後reactを使いたいからですね!使わないなら削除してもらって大丈夫です。

docker-compose.yml

version: '3'

services:
  rails:
    build: .
    container_name: example_rails
    tty: true
    stdin_open: true
    ports:
      - 3000:3000
    environment:
      - "DATABASE_HOST=database"
      - "DATABASE_PORT=5432"
      - "DATABASE_USER=user_name"  #好きな名前でどうぞ
      - "DATABASE_PASSWORD=your_password"   #好きな文字列でどうぞ
    volumes:
      - .:/app:cached
      - /app/.git
      - /app/node_modules
      - /app/log
      - /app/tmp
    command: rails s -b 0.0.0.0 -p 3000  --environment development
    depends_on:
      - database
    links:
     - database
  database:
    image: postgres
    container_name: example_db
    volumes:
      - datavol:/var/lib/postgresql/data
    environment:
      - "POSTGRES_USER=user_name"   # 上で設定したものと同じ
      - "POSTGRES_PASSWORD=your_password"    # 上で設定したものと同じ
    ports:
      - 5432:5432
volumes:
  datavol:

postgresQLのデータ永続化については、

datavol:/var/lib/postgresql/data

の部分の記載で実現できています。dockerのボリュームとは、データを永続化する場所のことで、ポスグレコンテナの中では volumes と指定している場所です。
(ホストのディレクトリ):(コンテナ内のディレクトリ) の書き方なので、今回の場合だと、example_dbコンテナの/var/lib/postgresql/dataにあるデータは、ホストのdatavolディレクトリに保存され、コンテナを削除してもホストにデータが残っている、ということです。

Gemfile

source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.1.5'

gem 'pg'
# Use Puma as the app server
gem 'puma', '~> 3.7'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'

  gem 'pry-rails'
  gem 'pry-doc'
  gem 'pry-byebug'
  gem 'pry-stack_explorer'

end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

大体は rails のデフォルトのgemfileと変わらないと思うのですが、一つ大きな違いが。
gem 'pg' の存在です。こいつがないと postgresQL で Active Recordが使えません。
代わりに gem 'sqlite3' が消えてます。これを入れたまま heroku にデプロイしようとするとエラーが出ます。

database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  username: <%= ENV.fetch('DATABASE_USER') { 'root' } %>
  password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %>
  host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %>
  port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %>
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: example_app_development  #  rails new で決めたアプリ名

test:
  <<: *default
  database: example_app_test #  rails new で決めたアプリ名

production:
  <<: *default
  database: example_app_production  #  rails new で決めたアプリ名
  username: example_app
  password: <%= ENV['EXAMPLE_APP_DATABASE_PASSWORD'] %>

実行コマンド

ファイルを全て設置し終わったら、

docker-compose up

と実行してください。初回だと10分ぐらいかかりますが、これで railspostgresQL のサーバが立つはず。

さ、Typescriptの勉強しよ....