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

##したいこと
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作成

```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```



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

 http://code-aim.work/docker-postgresql/