Docker composeでstrapi+PostgreSQL開発環境を作る

理想の形になっていないのでそのうちブラッシュアップする…

## フォルダ・ファイル構成

```
.
├── app //空フォルダ
├── db
│   └── pgsql-data //空フォルダ
└── docker-compose.yml
```

## docker-compose.ymlを用意

2019年12月時点では下記が入ります。
Node.js : v13.2.0
PostgreSQL : psql (PostgreSQL) 10.11

```yaml:docker-compose.yml
version: '3'
services:
  postgres:
    image: postgres:10-alpine
    container_name: "test-postgres-db"
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - ./db/pgsql-data:/var/lib/postgresql/data
  app:
    image: node:13.2.0
    ports:
      - "8080:8080"
      - "21337:1337"
    volumes:
      - ./app:/src
    working_dir: /src
    tty: true
    depends_on: 
      - postgres
```

## 起動
`docker-compose.yml`のあるディレクトリで。

```
$ docker-compose up -d
```

## コンテナに入る

`docker-compose.yml`のあるディレクトリで。

```
$  docker-compose exec app /bin/bash
```

## strapiをインストール

`app`コンテナに入り、`strapi`をインストールしたいディレクトリで。
※このdocker-composeでは`working_dir`としてホストの`./app`をマウントしている`/src`を指定しているので、入ったそのまま`/src`が楽だと思います。

```
npx create-strapi-app test-app
```

### strapi設定
dockerコンテナの設定に合わせる。Hostを`docker-compose.yml`内のサービスの名前に合わせると接続できる。

```
? Choose your installation type Custom (manual settings)
? Choose your default database client postgres
? Database name: postgres
? Host: postgres
? Port: 5432
? Username: postgres
? Password: ******
? Enable SSL connection: No
```

ログ

```
Creating a project with custom database options.
Creating files.
Dependencies installed successfully.

Your application was created at /src/test-app.

Available commands in your project:

  yarn develop
  Start Strapi in watch mode.

  yarn start
  Start Strapi without watch mode.

  yarn build
  Build Strapi admin panel.

  yarn strapi
  Display all available commands.

You can start by doing:

  cd /src/test-app
  yarn develop
```

DB接続周りでエラーが出ている場合は、`postgres`のコンテナがうまく起動していないなどをうたがう・

## strapiを起動

```
cd test-app
yarn develop
```

ログ

```
$ strapi develop
Building your admin UI with development configuration ...

✔ Webpack
  Compiled successfully in 42.05s

[2019-12-13T11:59:45.458Z] info File created: /src/test-app/extensions/users-permissions/config/jwt.json

 Project information                                                          

┌────────────────────┬──────────────────────────────────────────────────┐
│ Time               │ Fri Dec 13 2019 11:59:45 GMT+0000 (Coordinated … │
│ Launched in        │ 12783 ms                                         │
│ Environment        │ development                                      │
│ Process PID        │ 8151                                             │
│ Version            │ 3.0.0-beta.17.8 (node v13.2.0)                   │
└────────────────────┴──────────────────────────────────────────────────┘

 Actions available                                                            

One more thing...
Create your first administrator 💻 by going to the administration panel at:

┌─────────────────────────────┐
│ http://localhost:1337/admin │
└─────────────────────────────┘

[2019-12-13T11:59:46.015Z] debug HEAD index.html (90 ms) 200
[2019-12-13T11:59:45.999Z] info ⏳ Opening the admin panel...
```
`docker-compose.yml`で21337へのアクセスを1337につながるようにしてあるので、このコンテナの`http://localhost:1337/admin`にホスト（Mac）側からアクセスするには、`http://localhost:21337/admin`でアクセス出来るようになっている。

## docker-compose.ymlに変更を加える

次回以降`docker-compose up -d`でstrapiの起動まで行えるように`docker-compose.yml`を変更しておく。
TODO: 変更したくないし、`Dockerfile`も書きたくないので、になんとかできないか模索する

```yaml:docker-compose.yml
version: '3'
services:
  postgres:
    image: postgres:10-alpine
    container_name: "test-postgres-db"
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - ./db/pgsql-data:/var/lib/postgresql/data
  app:
    image: node:13.2.0
    ports:
      - "8080:8080"
      - "21337:1337"
    volumes:
      - ./app:/src
    working_dir: /src/test-app #strapiに合わせて変更
    tty: true
    depends_on: 
      - postgres
    command: yarn develop # develop起動用にコマンドを指定
```

## ストップする
`docker-compose.yml`のあるディレクトリで。

```
docker-compose stop
```

## （おまけ）ホストからDBにアクセス

基本的にデフォルトです。パスワードは`docker-compose.yml`の`POSTGRES_PASSWORD `に入力したものが使われます。
コンテナ間の通信とはホスト設定が違います。

| 項目 | 値 |
|:-:|:-:|
| Host |  127.0.0.1 |
| Port | 5432 |
| User | postgres |
| Password | secret |
| Database | postgres |

## （おまけ）APP（GUI）を活用する

Docker composeは[Kitematic](https://kitematic.com/)を、ホストからのDB接続は[TablePlus](https://tableplus.com/)（or 他のGUIクライアント）の利用を推奨。
Kitematicを使えば、上記の[コンテナに入る]はボタンクリックで出来るようになり、コマンドやサービス名を覚えていなくてもいいですし、DBはちまちまコマンド叩くよりGUIで情報量を増やすほうが作業効率がいいと思います。

## まとめ

これはstrapiのサンプルですが、もちろんNode.js製のフレームワークであればなんでも応用可能です。
なにかやってみたいと思ったタイミングで、プロジェクトのディレクトリを作る→この`docker-compose.yml`を置いて微調整（nodeのバージョンなど）、いらなくなったら即捨てる、でいかがでしょうか。