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にサービス名を設定することで、エラーを起こさないで済むらしいです。

関連の Github Issue