【Laradockバージョン】docker-composeでMinio起動時にデフォルトのバケットを作成する

[1]:[https://qiita.com/terukizm/items/6850aa316de425e3e3b4]
[2]:[https://docs.min.io/docs/minio-client-complete-guide.html]
[3]:[https://laradock.io/]
[4]:[https://github.com/minio/mc]
[5]:[https://qiita.com/sivertigo/items/9baa73d922a68788402b]

現在業務で、WEBサイトの作成・改修を行なっています。
Minioを利用して、画像のダウンロード・アップロード処理を行なっています。
複数のバケットを使用しているので、`docker-compose up`の時に
バケットを、さくっと一括作成できればと考えました。

[こちらの記事][1]で、既に同じ内容が投稿されていたのですが、[Laradock][3]の
docker-compose.ymlファイルで試したところ、うまくいかなかったのでこの記事を書きました。

##minioの設定

・アクセスキー：`Accesskey`
・シークレットキー：`Secretkey`
・バケット名：`firstbucket`

今回は、上記の設定で進めていきます。
アクセスキー・シークレットキー・バケット名に決まりはありません。
ご自身の好きな文字列に置き換えてください。
##docker-compose.yml（初期値）

Minioの初期値は以下のようになっています。
`environment`の下に、任意のアクセスキーとシークレットキーを設定してください。

しかし、このままだと、Minioを起動することしかできません。
新しくバケット作成を行うServiceを定義する必要があります。

```yml:docker-compose.yml
 ### Minio ################################################
     minio:
       build: ./minio
       volumes:
         - ${DATA_PATH_HOST}/minio/data:/export
         - ${DATA_PATH_HOST}/minio/config:/root/.minio
       ports:
         - "${MINIO_PORT}:9000"
       environment:
         - MINIO_ACCESS_KEY=Accesskey
         - MINIO_SECRET_KEY=Secretkey
       networks:
         - frontend
         - backend
```

## docker-compose.yml（Bucket作成）

それでは、バケット作成用のServiceを、上記のymlファイルに組み込んでいきましょう。
今回、Service名を`createBuckets`とします。（ここも任意の文字列で大丈夫です)

```yml:docker-compose.yml
 minio:
 　ーーー省略ーーー
 createbuckets:
    image: minio/mc:latest
    depends_on:
      - minio
    entrypoint: >
      /bin/sh -c "
      until (/usr/bin/mc alias set myminio http://host.docker.internal:9000 Accesskey Secretkey --api S3v4) do echo '...waiting...' && sleep 1; done;
      /usr/bin/mc admin info myminio;
      /usr/bin/mc mb myminio/firstbucket;
      /usr/bin/mc policy set download myminio/firstbucket
      exit 0;
      "
```

## docker-compose up 実行結果

`docker-compose up createbuckets`を入力して、
下記のような出力が出ると成功です。

```terminal:docker-compose_up_実行
$ docker-compose up createbuckets

laradock_minio_1 is up-to-date

Recreating laradock_createbuckets_1 ... done

Attaching to laradock_createbuckets_1
createbuckets_1        | Added `myminio` successfully.
createbuckets_1        | ●  host.docker.internal:9000
createbuckets_1        |    Uptime: 2 minutes 
createbuckets_1        |    Version: 2021-04-22T15:44:28Z
createbuckets_1        |    Network: 1/1 OK 
createbuckets_1        | 
createbuckets_1        | 54 KiB Used, 8 Buckets, 5 Objects
createbuckets_1        | Bucket created successfully `myminio/firstbucket`.
createbuckets_1        | Access permission for `myminio/firstbucket` is set to `download`
laradock_createbuckets_1 exited with code 0
```

`http://localhost:9000`にアクセスし、設定したアクセスキー・シークレットキーを使用して
ログインするとバケットが作成されているのが確認できます。

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/3b4e7b3b-4b4a-10cd-1b20-9b3151b6a01b.png">


## 解説

ここからは、`createbuckets`の内容を1行ずつ見ていきます。

```yml:Service
createbuckets:
```
ここは、`docker-compose up`の後に指定するサービス名です。
特に、決まりはないので、わかりやすく重複していない名前にしてください。

---

```yml:image
image: minio/mc:latest
```
ここでは、最新の[Minio Client][4]のイメージを指定しています。

---

```yml:depends_on
depends_on:
  - minio
```
`depends_on`は、コンテナを起動させる順番を決めるものです。
①minio ②createbucketsの順番で起動するように設定しています。
今回の`createbuckets`のサービスは、Minioにバケットを作成するものなので、
このサービスが動く前に、Minioが起動している必要があります。
従って、この`depends_on`が必要になってきます。

しかし、[この記事][5]によると、保証してくれるのは起動の順番だけで、
起動が完了しているかどうかは、保証してくれないそうです。。

---

```yml:entrypoint
    entrypoint: >
      /bin/sh -c "
      until (/usr/bin/mc alias set myminio http://host.docker.internal:9000 Accesskey Secretkey --api S3v4) do echo '...waiting...' && sleep 1; done;
      /usr/bin/mc admin info myminio;
      /usr/bin/mc mb myminio/firstbucket;
      /usr/bin/mc policy set download myminio/firstbucket;
      exit 0;
      "
```

- 1行目　`/bin/sh -c` では、その後にコマンドを入力することを定義しています。

- 2行目前半　`until (/usr/bin/mc alias set myminio http://host.docker.internal:9000 Accesskey Secretkey --api S3v4)`　
　・ `until()`
　　・ カッコ内の条件が真になるまで繰り返し実行される制御文です。(minioの起動を待つためです/起動していないと失敗してしまうので。)
　・ `/usr/bin/mc alias set myminio http://host.docker.internal:9000 Accesskey Secretkey --api S3v4`
　　・ 使用しているminioの情報(アクセスキー、シークレットキー、URL)`myminio`という名前でエイリアス登録しています。

- 2行目後半 `do echo '...waiting...' && sleep 1; done;`
　・`...waiting...`の文字列表示します。
　・１秒間の待機時間を設けています。(minioの起動を待つため)

- 3行目 `/usr/bin/mc admin info myminio;`
　・先ほど2行目前半で登録したエイリアス(myminio)の情報を表示できます。

- 4行目 `/usr/bin/mc mb myminio/firstbucket;`
　・バケットを作成するコマンドです。
　・`mb`はおそらく、`make bucket`の略語かな・・？
　・`登録したエイリアス名/作成したいバケット名`を指定してください。
　・**複数のバケットを作りたい場合は、この行を複数記述してください。**

- 5行目 `/usr/bin/mc policy set download myminio/firstBucket;`
　・既存のバケットにポリシーを設定できます。
　・今回は、`download`を指定しているので、ダウンロードだけを許可する設定にしています。
　・個人のニーズに応じて、複数記述したり、色々と変更してみてください。(使用可能なオプション：[none, download, upload, public])

- 6行目 `exit 0;`
　・サービスを終了させるコードです。

---

間違っている情報、うまく動かないなどありましたら、ぜひコメント欄にて教えてください。
最後まで、お読みいただきありがとうございました。

## 参考
[docker-composeでMinio起動時にデフォルトのbucketを作成する -Qiita-][1]
[docker-compose depends_onとlinksの違い -Qiita-][5]
[MinIO Client Complete Guide][2]
[Laradock][3]
[minio/mc -Github-][4]