bitnami/mongodb
“mongodb docker"などと調べると、Docker 公式イメージが見つかると思います。 しかしこれでレプリカセットを構築しようとするとゴニョゴニョする必要があり、私は失敗しました。諦めました。 お勧めしません。
その試行錯誤の過程でエラーメッセージを検索しているときに見つけたのがbitnami/mongodb
イメージです。
Bitnami は VMware 傘下の企業で、主にオープンソースソフトウェアを使いやすくパッケージングし、企業にサポートを提供する企業のようです。
その副産物として私たちはbitnami/mongodb
のようなイメージを使えるというわけです。
compose.yaml
# compose.yaml
services:
mongo:
image: bitnami/mongodb:7.0
ports:
- 27017:27017
volumes:
- mongo:/bitnami/mongodb
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MONGODB_REPLICA_SET_MODE=primary
- MONGODB_ADVERTISED_HOSTNAME=mongo
restart: always
volumes:
mongo:
これでdocker compose up
すれば、mongodb が使えるようになります。
MONGODB_ADVERTISED_HOSTNAME
この環境変数はサービス名と同じである必要があります。
この例の場合、mongo
です。
この環境変数はなくても起動はできますが、起動後docker compose down
などでコンテナを削除してしまうと、
NotYetInitialized: Cannot use non-local read concern until replica set is finished initializing.
のようなエラーがでて起動できなくなります。
推測ですが、docker compose
で自動的に生成されるランダムなホスト名を、mongodb はノードのホスト名として保存してしまうからでしょう。
コンテナの再作成時にはランダムなホスト名は当然変わっているので、不整合が起きてしまうのでしょう。
docker compose
の仕様として、そのランダムなホスト名だけでなく、サービス名(ここではmongo
)もホスト名として使うことができます。
(例えばmongo
が Web サーバーのコンテナならhttp://mongo
で接続できる。)
そのため、MONGODB_ADVERTISED_HOSTNAME
にサービス名を設定することで、エラーを起こさないで済むらしいです。