【Rails API】Rails API on Docker + scaffoldのHello Worldを行ってみた ~STEP1:Docker環境構築~

はじめに

こんにちは、がんがんです。
最近、Rails API + PostgreSQLの環境をDockerにて用意し、scaffoldを用いた簡単な実験を行う機会がありました。


今回の記事では、Rails + PostgreSQL on Dockerの環境構築に関する備忘録をまとめたいと思います。


以前からRuby on Rails on Dockerとは何度も戦いを繰り広げてきました。毎回DB接続で上手くいかずに構築が上手くいかなかったことが多かったです。
無事に構築が完了したので今後のために備忘録をまとめておきます。

今回のゴール

環境

  • Docker for Windows:19.03.12
  • docker-compose:1.26.2
  • Ruby:2.7.1 (2.7.1-alpine3.12)
  • Ruby on Rails:5.2.4
  • Postgre SQL:11.9 (11.9-alpine)


環境構築

参考記事をお手本にしながら環境を構築していきます。Dockerイメージは軽くしたかったのでalpineを採用しています。

docker-compose.yml

公式ドキュメントではvolumeの設定がありませんでした。しかし、postgreSQLでエラーが起きたので追加しています。

version: '3'

services:
  db:
    container_name: test_db
    image: postgres:11.9-alpine
    volumes:
      - dbdata:/var/lib/postgresql/data
    environment:
      - TZ=Asia/Tokyo
      - POSTGRES_PASSWORD=password

  back:
    build: .
    command: ash -c "rm -f /myapp/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    image: rails-api:dev
    container_name: test_back
    ports:
      - 3000:3000
    volumes:
      - ./api:/myapp
    depends_on:
      - db

volumes:
  dbdata:

Dockerfile

公式ドキュメント等ではファイルをコピーしていますが、back.volumesで共有しているので省いています。

FROM ruby:2.7.1-alpine3.12

ENV RUNTIME_PACKAGES="linux-headers libxml2-dev make gcc libc-dev nodejs tzdata postgresql-dev postgresql git" \
    DEV_PACKAGES="build-base curl-dev" \
    HOME="/myapp" \
    LANG=C.UTF-8 \
    TZ=Asia/Tokyo

WORKDIR ${HOME}
COPY ./api/Gemfile* ${HOME}/

RUN apk update && \
    apk upgrade && \
    apk add --update --no-cache $RUNTIME_PACKAGES && \
    apk add --update --virtual build-dependencies --no-cache $DEV_PACKAGES && \
    bundle install -j4 && \
    apk del build-dependencies

CMD [ "rails", "server", "-b", "0.0.0.0" ]

Gemfile

Railsのバージョンは当初Rails6を想定していましたが、JS周りを特に使うことはないのでRails5を採用しています。
そのため、Docker公式に寄せています。

source 'https://rubygems.org'
gem 'rails', '~>5'

Gemfile.lock

こちらは空で構築します。

プロジェクトを作成・Railsの起動確認

ファイルの準備が整ったのでrunを行っていきます。

$  docker-compose run --rm back rails new . --api -f --database=postgresql


プロジェクト構築が完了したらapi/config/database.ymlを修正します。
postgreSQLイメージの更新により、passwordは必須項目となったようです。

#  省略
default: &default
  adapter: postgresql
  encoding: unicode
  username: postgres  #  add
  password: password  #  add
  host: db  #  add
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
#  省略


database.ymlの設定が終わったら、実際に起動確認を行います。

$  docker-compose build
$  docker-compose run --rm back rails db:create
$  docker-compose up -d


RailsHello Worldでおなじみに画面に無事遭遇することが出来ました。とってもよかったです。
f:id:gangannikki:20200930204835j:plain

今回起こったエラー

1. could not translate host name "db" to address: Name does not resolve

could not translate host name "db" to address: Name does not resolve
Couldn't create 'app_development' database. Please check your configuration.
rails aborted!
PG::ConnectionBad: could not translate host name "db" to address: Name does not resolve

docker-composeのログを見てみると以下のような形でした。

$ docker-compose logs db
Attaching to ft_db
ft_db   | Error: Database is uninitialized and superuser password is not specified.
ft_db   |        You must specify POSTGRES_PASSWORD to a non-empty value for the
ft_db   |        superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".     
ft_db   |
ft_db   |        You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
ft_db   |        connections without a password. This is *not* recommended.
ft_db   |
ft_db   |        See PostgreSQL documentation about "trust":
ft_db   |        https://www.postgresql.org/docs/current/auth-trust.html

qiita.com

おわりに

今回の記事では、Rails + PostgreSQL on Dockerの環境構築に関する備忘録をまとめました。
比較的以前から戦うことが多かっただけに(基本的にDBで殺される)、無事構築することが出来てよかったです。


次回の記事は、実験メインであるAPIに関する備忘録をまとめていきたいと思います。