docker-composeでMinio起動時にデフォルトのbucketを作成する

MySQLとかPostgresみたいに環境変数経由でデフォルトのbucketが作れれば楽なんですが、Minioは現状そうなってないので、`docker-compose.yml`だけでデフォルトのbucketを作成する方法のメモです。

* アクセスキー: `AKIA_MINIO_ACCESS_KEY`
* シークレットキー: `minio_secret_key`
* バケット名: `mybucket`
* (リージョン): `us-east-1`

```docker-compose.yml
version: '3'

services:
  minio:
    image: minio/minio:latest
    ports:
      - 19000:9000
    volumes:
      - ./data/minio/data:/export
      - ./data/minio/config:/root/.minio
    environment:
      MINIO_ACCESS_KEY: AKIA_MINIO_ACCESS_KEY
      MINIO_SECRET_KEY: minio_secret_key
    command: server /export 
  createbuckets:
    image: minio/mc
    depends_on:
      - minio
    entrypoint: >
      /bin/sh -c "
      until (/usr/bin/mc config host add myminio http://minio:9000 AKIA_MINIO_ACCESS_KEY minio_secret_key) do echo '...waiting...' && sleep 1; done;
      /usr/bin/mc mb myminio/mybucket;
      /usr/bin/mc policy download myminio/mybucket;
      exit 0;
      "
```

`docker-compose up`で起動。

```
% docker-compose up
Creating network "minio_default" with the default driver
Creating minio_minio_1 ... done
Creating minio_createbuckets_1 ... done
Attaching to minio_minio_1, minio_createbuckets_1
minio_1          |
minio_1          |  You are running an older version of Minio released 1 month ago
minio_1          |  Update: docker pull minio/minio:RELEASE.2018-05-04T23-13-12Z
minio_1          |
minio_1          |
createbuckets_1  | Added `myminio` successfully.
createbuckets_1  | mc: <ERROR> Unable to make bucket `myminio/mybucket`. Your previous request to create the named bucket succeeded and you already own it.
minio_1          | Drive Capacity: 18 GiB Free, 224 GiB Total
minio_1          |
minio_1          | Endpoint:  http://172.26.0.2:9000  http://127.0.0.1:9000
minio_1          | AccessKey: AKIA_MINIO_ACCESS_KEY
minio_1          | SecretKey: minio_secret_key
minio_1          |
minio_1          | Browser Access:
minio_1          |    http://172.26.0.2:9000  http://127.0.0.1:9000
minio_1          |
minio_1          | Command-line Access: https://docs.minio.io/docs/minio-client-quickstart-guide
minio_1          |    $ mc config host add myminio http://172.26.0.2:9000 AKIA_MINIO_ACCESS_KEY minio_secret_key
minio_1          |
minio_1          | Object API (Amazon S3 compatible):
minio_1          |    Go:         https://docs.minio.io/docs/golang-client-quickstart-guide
minio_1          |    Java:       https://docs.minio.io/docs/java-client-quickstart-guide
minio_1          |    Python:     https://docs.minio.io/docs/python-client-quickstart-guide
minio_1          |    JavaScript: https://docs.minio.io/docs/javascript-client-quickstart-guide
minio_1          |    .NET:       https://docs.minio.io/docs/dotnet-client-quickstart-guide
createbuckets_1  | Access permission for `myminio/mybucket` is set to `download`
minio_createbuckets_1 exited with code 0
```

http://localhost:19000/ にアクセスし、アクセスキー&シークレットキーでログイン、`mybucket`が表示されれば成功です。

ポイントは以下の2点。

* `minio/minio`イメージの中には`mc`コマンドが入っていないので、`minio/mc`イメージを別コンテナで起動して`mc mb`コマンドでバケットを作成
* minio本体が起動する前にmcコマンドが走ってしまい失敗することがあるので、until & sleepで起動を待つ


他にも以下のようにminio(-server)単体でmkdirでディレクトリを作り、`policy.json`を置く方法もあります。カスタムした`policy.json`を使いたい場合はこっちの方が楽かもしれません。

```docker-compose.yml
    minio:
      image: minio/minio:latest
        (略)
      entrypoint: sh
      command: -c "
        mkdir -p /data/mybucket;
        mkdir -p /data/.minio.sys/buckets/mybucket;
        cp /policy.json /data/.minio.sys/buckets/mybucket/policy.json;
        /usr/bin/minio server /export;
       "
      volumes:
         - ./data/minio/data:/export
         - ./data/minio/config:/root/.minio
         - ./config/policy.json:/policy.json
```

> 参考: [Create default buckets via environment variables in docker · Issue \#4769 · minio/minio](https://github.com/minio/minio/issues/4769)