MacでDocker上に日本語環境のPostgreSQLを建てる

# 前書き

* Docker に PostgreSQL コンテナを日本語環境でサクッと建てたい！
* PostgreSQL のバージョンは最新のバージョンにしたい！
* Mac で作業したい！
* AWS RDS の PostgreSQL とバージョンを合わせた PostgreSQL コンテナを建てたい！

を叶えるためのメモ。
[MacでDocker上に日本語環境のMySQL8.0を建てる](https://qiita.com/oono_yoshi/items/4c9c2ea554b5626ff50c) の PostgreSQL 版です。
タイトルで Mac と謳っていますが上記の MySQL 版と同様に Windows でもほぼ同じ手順です。
違いは Docker のインストーラーが Mac 用か Windows 用かだけです。
なお、このページの文体・構成は上記 MySQL 版 に合わせています。


# 環境

* Mac 10.15.1 (Catalina)
* Docker for Mac


# 事前準備
1. Docker Desktop for Mac をインストールする
　参考URL：https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81

2. Kitematic をインストールする
　→DockerコンテナをGUIで操作できるアプリ。インストール手順はタスクトレイのDockerアイコンから。
　　docker-composeで設定した共有ディレクトリやポートなどの確認もこれで行いました。


# docker-composeでPostgreSQLコンテナを立てる

参考URL

* [Docker PostgreSQLイメージを利用する](https://qiita.com/kimullaa/items/70eaec61c02d2513e76c)
* [postgres の docker hub official ページ](https://hub.docker.com/_/postgres/)


上記を参考に、PostgreSQLのコンテナを日本語環境で建てる。
特に1つ目のリンクはほぼそのまま参考にさせていただきました。とても詳しく記載されているので、当記事よりは1つ目のリンクを参考にしたほうが良いと思います。


```yml:docker-compose.yml
version: '3'
volumes:                           # ※ホストOSで永続化
    postgres_data:
        driver: 'local'
services:
  postgres:
    build:
      context: ./postgres
      dockerfile: Dockerfile
    container_name: "postgres_db"
    environment:
      POSTGRES_PASSWORD: postgres  #スーパーユーザ(postgres)のパスワード
      POSTGRES_USER: test          #ユーザアカウント
      POSTGRES_PASSWORD: password  #ユーザアカウントのパスワード
      POSTGRES_DB: testDb          #DB名
      TZ: "Asia/Tokyo"
    ports:
      - 15432:5432
    volumes:
      - postgres_data:/var/lib/postgresql/data    # ※ホストOSで永続化
      - ./postgres/sql:/docker-entrypoint-initdb.d
```

```dockerfile:Dockerfile
FROM postgres:12.1
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8
```

上記のディレクトリイメージは以下の通り。

```txt
├── docker-compose.yml
└── postgres
    ├── Dockerfile (上記のファイル)
    └── sql (ディレクトリ)
```

接続確認は適当なDBクライアントでOK。 当方は`DBeaver`で確認しました。

初期構築用のCreateTableやInsertなどのSQLファイルはsqlディレクトリに放り込むイメージです。

PostgreSQLのファイルをホストOS側で永続化する必要がない(コンテナ内で保持する)場合は、docker-compose.xml の `※ホストOSで永続化` とコメントしている部分の設定を削除してください。


# メモ

## 日本語を使用するための設定が MySQL 版 で記載したものと違うけど？

そもそもMySQLとPostgreSQLの各Docker Hub の Official ページで公開されているコンテナのDockerfile内のロケール・言語の設定が異なるため。
[MySQL 版の Dockerfile](https://github.com/docker-library/mysql/blob/6659750146b7a6b91a96c786729b4d482cf49fe6/8.0/Dockerfile) では元になっているDebianのロケール・言語設定をそのまま使用すようになっているため、ロケール・言語として日本語を使用するための設定が必要になります。
反面 [PostgreSQL 版 のDockerfile](https://github.com/docker-library/postgres/blob/4a82eb932030788572b637c8e138abb94401640c/12/Dockerfile) ではUTF-8を使用する設定がされているため、ロケールだけ変更すればOKとなっています。

## AWS RDS for PostgreSQL とバージョンを揃えたい

[Amazon RDS for PostgreSQL のよくある質問](https://aws.amazon.com/jp/rds/postgresql/faqs/) を見ると、AWS RDS for PostgreSQL で使用されているバージョンは、
`PostgreSQL 9.4、9.5、9.6、10、および 11` となっています。(当ページ記載時点)
そのため、上記バージョンを使用するには `Dockerfile` の FROMタグ部分を以下のいずれかにすればOK 
※ここでは簡素に記載しています。正確な情報・詳細は [PostgreSQL の Docker Hub Officialページ](https://hub.docker.com/_/postgres/) を参照してください。

* FROM postgres:9.4
* FROM postgres:9.5
* FROM postgres:9.6
* FROM postgres:10
* FROM postgres:11

## Postgresコンテナの永続化用のボリュームを削除したい

[Docker volumeの削除](https://qiita.com/Ikumi/items/b319a12d7e2c9f7b904d) を参考に、
当ページ内のコンテナの場合は以下で削除できます。

```sh
docker volume rm postgresql_postgres_data
```

ボリュームの一覧を確認する場合は以下のコマンドです。

```sh
docker volume ls
```