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


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

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

minioの設定

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

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

docker-compose.yml(初期値)

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

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

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とします。(ここも任意の文字列で大丈夫です)

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を入力して、
下記のような出力が出ると成功です。

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にアクセスし、設定したアクセスキー・シークレットキーを使用して
ログインするとバケットが作成されているのが確認できます。

解説

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

Service
createbuckets:

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


image
image: minio/mc:latest

ここでは、最新のMinio Clientのイメージを指定しています。


depends_on
depends_on:
  - minio

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

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


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...の文字列表示します。
     ・1秒間の待機時間を設けています。(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-
docker-compose depends_onとlinksの違い -Qiita-
MinIO Client Complete Guide
Laradock
minio/mc -Github-