私はMongoDBのコンテナがデータベースを作成するには、ホストJSONファイルを使用したかった、と一度、モンゴの画像のすべてのコンテナが後でit.Iが考え共有することができます作成bind mount
し、volume
動作する可能性があり、これらの次のステップは、私はそれに対処する方法を示しています。
doc_info_product.json
と名前付きボリュームmymongo_data
をmongo
mongoイメージのコンテナー名にマウントしました。 docker run -d --name mongo --mount type=bind,source=V:\repository\How-to\doc_info_product.json,target=/data/db/doc_info.json -v mymongo_data:/data mongo:latest
mongo
を使用mongoimport
してデータベースを作成します。 docker exec -it mongo bash /# mongoimport --db mydb --collection doc --type json --file /data/db/doc_info.json --jsonArray
今ではmongo
、コンテナ、私は、データベース名だったmydb
と収集をdoc
してチェックすると、それにshow dbs
してshow collections
。
次に、mongo2ランチと呼ばれる別のコンテナもマウントされましたmymongo_data
: docker run -d -v mymongo_data:/data --name mongo2 mongo:latest
しかし、チェックmongo2
してみたところshow dbs
、取得mydb
できませんでした。では、どうすればmydb
別のコンテナに入れることができ、なぜ取得できなかったのでしょうか。
編集:私はもともと非モンゴ固有の観点からこれに答えましたが、ホストとして非Linuxを使用する場合、実際にはモンゴ固有の問題であることに気付きました:https://hub.docker.com/_/mongo //
警告(WindowsおよびOS X):WindowsおよびOS XのデフォルトのDockerセットアップは、VirtualBoxVMを使用してDockerデーモンをホストします。残念ながら、VirtualBoxがホストシステムとDockerコンテナー間でフォルダーを共有するために使用するメカニズムは、MongoDBで使用されるメモリマップファイルと互換性がありません(vboxのバグ、docs.mongodb.orgおよび関連するjira.mongodb.orgのバグを参照)。これは、データディレクトリがホストにマップされた状態でMongoDBコンテナを実行できないことを意味します。
これを回避する方法は、ホストからのマウントの代わりにDockerボリュームを使用することです。
# Create a volume for persistent data
$ docker volume create mongodata
mongodata
# Start the mongo container, mount the db volume and
# also my downloads directory as a place to get a file to import
$ docker run -d --name mongo -v mongodata:/data/db \
-v ~/Downloads/:/json mongo:latest
0755cc15f7550dce7fc4bef28da90216a95d5763df98518786533b6314c231d7
# Exec into the container and do the import
$ docker exec -it mongo bash
root@0755cc15f755 :/# mongoimport --db mydb --collection doc \
--type json --file /json/test.json
2018-04-28T14:32:49.102+0000 connected to: localhost
2018-04-28T14:32:49.118+0000 imported 1 document
# Show the db is present and exit
root@0755cc15f755:/# mongo
> show dbs
admin 0.000GB
local 0.000GB
mydb 0.000GB
>
bye
root@0755cc15f755:/# exit
# After exiting the exec, stop the first container
$ docker stop mongo
mongo
# Start a new container using the same volume for data
$ docker run -d --name mongo2 -v mongodata:/data/db mongo:latest
b6bda766217c6fe4ed355c1faaa5880471b6841eb68c8dd75a3cb72aa5c39ff5
# Exec into this
$ docker exec -it mongo2 bash
# Show the data is still there!
root@b6bda766217c:/# mongo
> show dbs
admin 0.000GB
local 0.000GB
mydb 0.000GB
ネイティブLinuxを使用していないことを考えると、これが最善の策です。
警告: mongoについては、何が起こるかを確実に知るには十分な知識がありませんが、一般に、同じデータディレクトリで2つのデータベースを同時に実行することは非常に悪い考えです。mongoはロックイン/data/db
を使用してこれが発生していることを検出し、それに応じて動作する場合とそうでない場合があります。したがって、そうすることを考えている場合は、常に明示的にする方がよいでしょう。1つを除くすべてのコンテナに、データディレクトリが読み取り専用でマウントされていることを確認してください。これを行うに:ro
は、ボリュームマウントの最後に次のように追加し-v mongodata:/data/db:ro
ます。
また、これをテストするためのWindowsにアクセスできませんが、JSONファイルで行うことであるコンテナーへのファイルのマウントに問題があることもわかります。これにより、コンテナに空のボリュームマウントが作成されると思います。代わりに、私が行ったように実行し、JSONファイル自体ではなくJSONファイルを含むディレクトリをマウントします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加