1. ホーム
  2. mongodb

[解決済み] docker-composeでmongoデータベースをシードするには?

2023-04-04 06:26:05

質問

私は、いくつかのリンクされたコンテナで実行されている、接続されたアプリケーションのセットを配布しようとしていますが、その中には、必要な mongo データベースが含まれています。

  • いくつかのシード データを含んで配布されます。
  • ユーザがデータを追加できるようにする。

理想的には、データはリンクされたデータボリュームコンテナに永続化されるでしょう。

データを mongo コンテナにデータを取り込むには mongo ベースインスタンスを使用して、ボリュームをマウントしない(dockerhub イメージ。 psychemedia/mongo_nomount - これは基本的に mongo の Dockerfile から VOLUME /data/db ステートメント) と Dockerfile の行に沿ったコンフィグを行います。

ADD . /files
WORKDIR /files
RUN mkdir -p /data/db && mongod --fork --logpath=/tmp/mongodb.log && sleep 20 && \
mongoimport  --db testdb --collection testcoll  --type csv --headerline --file ./testdata.csv  #&& mongod --shutdown

ここで ./testdata.csv は同じディレクトリにある ( ./mongo-with-data )にあるDockerfileと同じです。

私のdocker-composeの設定ファイルには、以下のようなものがあります。

mongo:
  #image: mongo
  build: ./mongo-with-data
  ports:
    - "27017:27017"
  #Ideally we should be able to mount this against a host directory
  #volumes:
  #  - ./db/mongo/:/data/db
  #volumes_from:
  #  - devmongodata

#devmongodata:
#    command: echo created
#    image: busybox
#    volumes: 
#       - /data/db

VOLUME をマウントしようとすると、元のシードデータ (これは /data/db - に格納されている元のシードデータが削除されたように見えます。私は、ボリュームが /data/db にマウントされると、現在そこにあるものを置き換えるのだと思います。

とはいえ docker userguide は示唆しています。 ボリュームは、コンテナの作成時に初期化されます。コンテナのベースイメージが指定されたマウントポイントにデータを含んでいる場合、その既存のデータは、ボリュームの初期化時に新しいボリュームにコピーされる ? ということで、シードの後にVOLUMEコマンドを配置すれば、データが持続すると予想されました。 RUN コマンドの後に配置すれば、データが持続すると期待したのですか?

では、私は何を間違えているのでしょうか?

長い目で見ると、リンクされた複数のコンテナのビルドを自動化し、そのコンテナに対して Vagrantfile /docker-compose YAML ファイルを配布し、リンクされたアプリのセットを起動します。 mongo データベースを含む、リンクされたアプリを起動するYAMLファイルです。

どのように解決するのですか?

私は、mongo のシードを行い、終了することのみを目的とした別の docker コンテナを使用してこれを行います。これは、次のものと同じ考えだと思います。 ebaxt と同じ考えだと思いますが、これに対する答えを探していたとき、私はただ、迅速で汚い、しかしわかりやすい例を見たかっただけなのです。そこで、ここに私のものを示します。

docker-compose.yml

mongodb:
  image: mongo
  ports:
    - "27017:27017"

mongo-seed:
  build: ./mongo-seed
  links:
    - mongodb

# my webserver which uses mongo (not shown in example)
webserver:
  build: ./webserver
  ports:
    - "80:80"
  links:
    - mongodb

mongo-seed/Dockerfile(ドッカーファイル

FROM mongo

COPY init.json /init.json
CMD mongoimport --host mongodb --db reach-engine --collection MyDummyCollection --type json --file /init.json --jsonArray

mongo-seed/init.json

[
  {
    "name": "Joe Smith",
    "email": "[email protected]",
    "age": 40,
    "admin": false
  },
  {
    "name": "Jen Ford",
    "email": "[email protected]",
    "age": 45,
    "admin": true
  }
]