【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接続で上手くいかずに構築が上手くいかなかったことが多かったです。
無事に構築が完了したので今後のために備忘録をまとめておきます。
目次
今回のゴール
- (本備忘録の内容) Ruby on Rails + PostgreSQLの環境をDocker(Docker Compose)で構築する
- Rails APIの検証実験(scaffold)を行ってみる
環境
- 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
RailsのHello Worldでおなじみに画面に無事遭遇することが出来ました。とってもよかったです。
今回起こったエラー
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
おわりに
今回の記事では、Rails + PostgreSQL on Dockerの環境構築に関する備忘録をまとめました。
比較的以前から戦うことが多かっただけに(基本的にDBで殺される)、無事構築することが出来てよかったです。
次回の記事は、実験メインであるAPIに関する備忘録をまとめていきたいと思います。