LoginSignup
6
8

More than 3 years have passed since last update.

【秒・思考停止】DockerでPostgresqlを導入して動かす方法【Rails6】

Last updated at Posted at 2020-04-18

したいこと

rails6上で思考停止でDockerを動かしたい。

Dockerを導入し、Postgresqlを入れようとしたところつまづいたので記録として残します。

Postgresqlでとりあえず動かしたい人向け。

環境

rails6
ruby 2.6.3
アプリのgemfileにpgを書いてbundle installしておいてください。

参考にした記事
https://qiita.com/xxl/items/74a91cef0c0dbaf80fcb
https://qiita.com/kenzoukenzou104809/items/b9e716204e0cd0cea447

とりあえず下記の記事をみつつ、環境構築します。
https://qiita.com/kenzoukenzou104809/items/b9e716204e0cd0cea447

事前準備

Docker-for-macをインストール
Dockerを起動させておく

アプリのディレクトリに以下ファイルを作成します。

  • Dockerfile:新規作成
  • docker-compose.yml:新規作成
  • config/database.yml:編集
  • entrypoint.sh:新規作成

Dockerfile作成

FROM ruby:2.6.3
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client yarn chromium-driver # yarnとchromium-driverを追記。rails6ではyarnのインストールが必須。
RUN mkdir /portfolio
WORKDIR /portfolio
COPY Gemfile /portfolio/Gemfile
COPY Gemfile.lock /portfolio/Gemfile.lock
RUN gem install bundler 
RUN bundle install
COPY . /portfolio
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.ymlを作成する

docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/portfolio
    ports:
      - "3000:3000"
    depends_on:
      - db
      - chrome
  chrome:
    image: selenium/standalone-chrome:3.141.59-dubnium
    ports:
      - 4444:4444

config/database.ymlを作成する

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: app_user_role  #記事内で後々出てきます。
  password: aaaa           #記事内で後々出てきます。
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test

entrypoint.shを作成する

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 "$@"

postgresqlのユーザーとパスワードを作成する(つまづいた部分)

上記3つのファイルの作成が終わったら、次にpostgresqlのユーザーとパスワードを作成します。

(postgresのデフォルトユーザー、デフォルトパスワードを作成しなければいけません。postgreqlはユーザー登録なしでも使えると思っていて、つまづきました。)
(また、postgresのデフォルトユーザー、デフォルトパスワードを作成しなければDocker内でデーターベースを作成することができません。ユーザー作成なしでdbを作る方法がありましたら教えてください。)

予めconfig/database.ymlファイルに書いた

config/database.yml

~省略~
 ユーザー名: app_user_role  
 パスワード : aaaa  
~省略~

こちらで作成します。
※注意)config/database.yml内でパスワードをそのまま入力するのはセキュリティの観点からよくないので、dotenvというgemを使って外から見えない様に設定することをお勧めします。
https://github.com/bkeepers/dotenv

#一度dockerを落とす
$ docker-compose down  

#コンテナ内に入り開発をするためにdockerコンテナを起動する
$ docker-compose up -d  

# postgresユーザのpasswordを設定するため、dbコンテナの中に入る
$ docker-compose exec db bash  


# postgresユーザのpasswordを設定する
root@コンテナid:/# passwd postgres

New password:                       #セキュリティ上表示されません(aaaaと入力してます)
Retype new password:                #セキュリティ上表示されません(aaaaと入力してます)

# 更新しましたと返ってくる。
passwd: password updated successfully

# パスワードを作成したpostgresユーザでログインを試みる
root@コンテナid:/# su - postgres

#無事入れる
postgres@コンテナid:~$ psql
psql (12.2 (Debian 12.2-2.pgdg100+1))

# 以下postgresユーザで\duと入力し実行する。
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

ここでpostgresのユーザーを作成します。

    #ユーザ名app_user_role、パスワードaaaaのユーザを作成する
postgres=# create role app_user_role WITH CREATEDB login password 'aaaa';
CREATE ROLE
postgres=# \du
                                     List of roles
   Role name   |                         Attributes                         | Member o
f
---------------+------------------------------------------------------------+---------
--
 app_user_role | Create DB                                                  | {}
 postgres      | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

ここまで終わったらexitを3回入力して出てください。

$ docker-compose stop
$ docker-compose up -d
$ docker-compose run web rake db:create   
   または
$ docker-compose run web bin/rake db:create   

にアクセスできれば成功です。
http://localhost:3000

秒でできなかったらコメントください。
間違ってるぶぶんがありましたらコメントください。

6
8
0

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
6
8