概要
MinIO で sample-bucket
バケットが存在しない場合に自動作成する仕組み を実装した。
当初、MinIO 起動直後に初期化用の mc
コマンドを実行すると connection refused
エラーが発生していたが、ヘルスチェック と depends_on の condition: service_healthy を活用することで解決した。
Docker Compose の構成
以下が最終的な docker-compose.yml
の内容である。
version: '3.8'
services:
minio:
image: minio/minio:latest
container_name: minio
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: minio
MINIO_ROOT_PASSWORD: minio123
command: server /data --console-address ":9001"
# ヘルスチェックの設定 (例)
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/ready"]
interval: 5s
timeout: 2s
retries: 5
restart: unless-stopped
minio-init:
image: minio/mc
depends_on:
# minio が "healthy" になるまで minio-init の起動を待機
minio:
condition: service_healthy
entrypoint: /bin/sh
command: >
-c "
mc config host add local http://minio:9000 minio minio123 &&
if mc ls local/sample-bucket; then
echo 'Bucket sample-bucket already exists.'
else
echo 'Bucket sample-bucket not found. Creating...'
mc mb local/sample-bucket
fi
"
volumes:
minio-data:
ポイント解説
1. MinIO のヘルスチェック設定
MinIO コンテナに以下のヘルスチェック設定を追加することで、コンテナが本当にリクエストを受け付け可能な状態になっているかどうかを判定している。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/ready"]
interval: 5s
timeout: 2s
retries: 5
この設定により、MinIO が起動してからヘルスチェックで OK と判断されるまで、依存関係のあるサービス(今回の場合は minio-init
)は実行を待機することができる。
2. minio-init サービスでのバケット自動作成
minio-init
サービスでは、MinIO Client (mc
) を用いて、以下の手順でバケットの存在確認と作成を行っている。
-
ホストの登録:
mc config host add local http://minio:9000 minio minio123
これにより、local
というエイリアスで MinIO サーバーに接続できるように設定する。 -
バケットの存在確認と作成:
if mc ls local/sample-bucket; then echo 'Bucket sample-bucket already exists.' else echo 'Bucket sample-bucket not found. Creating...' mc mb local/sample-bucket fi
ここで、既に
sample-bucket
バケットが存在する場合はその旨を表示し、存在しなければmc mb
コマンドで新規作成するように設定している。
3. depends_on と condition: service_healthy の活用
minio-init
サービスは、depends_on
において以下のように設定している。
depends_on:
minio:
condition: service_healthy
これにより、MinIO コンテナのヘルスチェックが成功(healthy 状態)するまで minio-init
は起動しないため、MinIO が完全に起動しないうちに接続しようとして connection refused
エラーが発生することを防いでいる。
まとめ
今回の実装では、Docker Compose の ヘルスチェック 機能と depends_on: condition: service_healthy
を活用することで、MinIO の起動タイミングを適切に待機し、初期化スクリプトが正常に実行できるようにした。
本当は、アクセスポリシーをパブリックに設定したかったが、うまくいかず、その部分は手動で行うことにした。今後解決できたらこうしんしようとおも