LoginSignup
78
89

More than 3 years have passed since last update.

Dockerを使ってRails6環境の構築をしてみる

Last updated at Posted at 2019-08-27

Rails6のリリースがされていたので、自身のPCに環境を作ってみた。

(環境)

Mac(Mojave 10.14.6)

(参考)

https://docs.docker.com/compose/rails/#define-the-project
に沿って実施。
実施の時は5系の記載だったので、6に置き換えて行う。

1.Docker for Macのインストール

(インストール済みならスキップ)
https://docs.docker.com/compose/install/

2.Rails / PostgreSQLアプリケーションを設定

Docker Composeを使用してRails / PostgreSQLアプリケーションを設定する。

2-1.プロジェクト定義

開発していくディレクトリにアプリケーションを構築するために必要な4つのファイルを設定する。
・Dockerfile
・Gemfile
・Gemfile.lock
・entrypoint.sh
・docker-compose.yml

*今回はPC内のUserフォルダ配下に作成
*プロジェクト名をmyappとして設定

$ mkdir myapp
$ cd myapp
Dockerfile
FROM ruby:2.6.6

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client yarn
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
Gemfile
source 'https://rubygems.org'
gem 'rails', '6.0.3'
Gemfile.lock(空のファイル)

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

2-2.プロジェクトの構築

作成した5つのファイルを利用してdocker-compose runを実行し、アプリケーションを生成する。(ターミナルを使って実施)

$ docker-compose run web rails new . --force --no-deps --database=postgresql
:
:
:
最後にWebpackerのインストール成功メッセージが表示される
Webpacker successfully installed 🎉 🍰

アプリケーション生成後は、以下を実施する。

$ docker-compose build
:
:
:
最後に下記のようなSuccess情報が表示される
Successfully built aa99bbad99f9
Successfully tagged myapp_web:latest

2-3.データベースの設定と作成

データベースの情報を設定するために、config/database.ymlを変更し、コマンドでDBを作成する。

config/database.yml
# 設定箇所のみ抜粋
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password # docker-compose.ymlのPOSTGRES_PASSWORDで指定した値
  pool: 5
:
:
development:
  <<: *default
  database: myapp_development
:
:
test:
  <<: *default
  database: myapp_test

データベースを作成する

$ docker-compose run web rake db:create

# 作成が成功すると、以下のコマンドが表示される。
Starting myapp_db_1 ... done
Created database 'myapp_development'
Created database 'myapp_test'

2-4.dockerを起動

dockerを起動し、ローカル環境のページにアクセスする。

docker-compose up

実行すると以下のコマンドが表示される。

myapp_db_1 is up-to-date
Starting myapp_web_1 ... done
Attaching to myapp_db_1, myapp_web_1
:
:
web_1  | => Booting Puma
web_1  | => Rails 6.0.3.2 application starting in development
web_1  | => Run `rails server --help` for more startup options
web_1  | Puma starting in single mode...
web_1  | * Version 4.3.5 (ruby 2.6.6-p146), codename: Mysterious Traveller
web_1  | * Min threads: 5, max threads: 5
web_1  | * Environment: development
web_1  | * Listening on tcp://0.0.0.0:3000
web_1  | Use Ctrl-C to stop

http://localhost:3000にアクセスして、ようこそページが表示されれば、構築完了。
スクリーンショット 2020-06-23 20.32.48.png

その他(アプリケーションの停止)

アプリケーションの停止はプロジェクトディレクトリでdocker-compose downを実行する。

・別のターミナルウィンドウを表示し、プロジェクトディレクトリから実施

$ docker-compose down
Stopping myapp_web_1 ... done
Stopping myapp_db_1  ... done
Removing myapp_web_run_b13a7c5899a1 ... done
Removing myapp_web_1                ... done
Removing myapp_web_run_5ad07400cf63 ... done
Removing myapp_db_1                 ... done
Removing network myapp_default

・downするともう一つのターミナル(docker-compose upした側)も停止の実行結果が表示される

web_1  | - Gracefully stopping, waiting for requests to finish
web_1  | === puma shutdown: 2019-08-25 23:58:46 +0000 ===
web_1  | - Goodbye!
web_1  | Exiting
myapp_web_1 exited with code 1
db_1   | 2019-08-25 23:58:47.254 UTC [1] LOG:  received smart shutdown request
db_1   | 2019-08-25 23:58:47.278 UTC [1] LOG:  background worker "logical replication launcher" (PID 28) exited with exit code 1
db_1   | 2019-08-25 23:58:47.279 UTC [23] LOG:  shutting down
db_1   | 2019-08-25 23:58:47.353 UTC [1] LOG:  database system is shut down
myapp_db_1 exited with code 0

履歴

20200622

再度構築してみたら、以下のエラーとなったので構築方法を修正、反映した。

PG::ConnectionBad: could not translate host name "db" to address: Name or service not known
  • postgresコンテナに環境変数POSTGRES_PASSWORDを設定
  • 設定した値をconfig/database.ymlのpasswordに定義

参考にした記事
https://qiita.com/at-946/items/2fb75cec5355fad4050d

20200623

バージョンを指定するように修正
ruby:2.6.6
gem 'rails', '6.0.3'

78
89
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
78
89