Mongodb Docker – 创build初始用户并设置初始结构

我正在尝试构build一个用户和基本数据库结构已经设置(从Dockerfile)的MongoDB容器。

这是我的Dockerfile:

FROM mongo:latest RUN mongo localhost:27017 "db.help()" 

(为了testing目的而将其缩小)。

我不断收到错误:

 connecting to: localhost:27017 2017-06-01T14:49:34.353+0000 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused 2017-06-01T14:49:34.353+0000 E QUERY [thread1] Error: couldn't connect to server localhost:27017, connection attempt failed : connect@src/mongo/shell/mongo.js:237:13 @(connect):1:6 exception: connect failed 

…和容器无法build立。 我甚至不知道如何检查日志,因为我是从Dockerfile构build的,一旦容器无法构build,就无法进入检查日志。

但是,如果我删除该运行命令并手动执行:

 docker -exec -it mongodb_container bash mongo > db.help() 

…有用。

我已经尝试将所有权设置为mongodb:mongodb,并尝试将日志和dbpath移动到〜/ db目录,但未成功。

PS:我正在使用docker-compose。 想用docker-compose做这个,所以开发人员不必自己pipe理。

这里是docker组成部分:

 mongodb: build: ./mongodb ports: - "27017:27017" 

编辑:

如果我将它更改为0.0.0.0:27017 ,那么我得到这个错误:

 MongoDB shell version v3.4.4 connecting to: 0.0.0.0:27017 2017-06-01T15:52:52.806+0000 E QUERY [thread1] Error: couldn't connect to server 0.0.0.0:27017, address resolved to 0.0.0.0 : connect@src/mongo/shell/mongo.js:237:13 @(connect):1:6 exception: connect failed 

EDIT2:

当我尝试使用以下Dockerfile时:

 FROM mongo:latest RUN mkdir -p /data/db2 \ && echo "dbpath = /data/db2" > /etc/mongodb.conf \ && chown -R mongodb:mongodb /data/db2 COPY . /data/db2 RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db2 

MongoDB最初启动,但随后输出:

 mongodb_1 | 2017-06-01T15:55:52.955+0000 I CONTROL [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=64a317041edd mongodb_1 | 2017-06-01T15:55:52.956+0000 I CONTROL [initandlisten] db version v3.4.4 mongodb_1 | 2017-06-01T15:55:52.956+0000 I CONTROL [initandlisten] git version: 888390515874a9debd1b6c5d36559ca86b44babd mongodb_1 | 2017-06-01T15:55:52.956+0000 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.1t 3 May 2016 mongodb_1 | 2017-06-01T15:55:52.956+0000 I CONTROL [initandlisten] allocator: tcmalloc mongodb_1 | 2017-06-01T15:55:52.956+0000 I CONTROL [initandlisten] modules: none mongodb_1 | 2017-06-01T15:55:52.956+0000 I CONTROL [initandlisten] build environment: mongodb_1 | 2017-06-01T15:55:52.956+0000 I CONTROL [initandlisten] distmod: debian81 mongodb_1 | 2017-06-01T15:55:52.956+0000 I CONTROL [initandlisten] distarch: x86_64 mongodb_1 | 2017-06-01T15:55:52.956+0000 I CONTROL [initandlisten] target_arch: x86_64 mongodb_1 | 2017-06-01T15:55:52.956+0000 I CONTROL [initandlisten] options: {} mongodb_1 | 2017-06-01T15:55:52.964+0000 E NETWORK [initandlisten] Failed to unlink socket file /tmp/mongodb-27017.sock Operation not permitted mongodb_1 | 2017-06-01T15:55:52.964+0000 I - [initandlisten] Fatal Assertion 28578 at src/mongo/util/net/listen.cpp 194 mongodb_1 | 2017-06-01T15:55:52.964+0000 I - [initandlisten] mongodb_1 | mongodb_1 | ***aborting after fassert() failure mongodb_1 | mongodb_1 | stuff_mongodb_1 exited with code 14 

你可以使用一个不同的方法。 你可以在第一次启动的时候给数据提供数据。 您可以使用辅助容器mongo-seed来完成这项工作。

看到这个方法:

 version: "2" mongodb: image: mongo ports: - "27017:27017" mongo-seed: image: mongo command: mongoimport --host mongodb --db example-db --collection MyDummyCollection --type json --file /init.json --jsonArray volumes: - ./init.json:/init.json 

init.json

 [ { "name": "Joe Smith", "email": "jsmith@gmail.com", "age": 40, "admin": false }, { "name": "Jen Ford", "email": "jford@gmail.com", "age": 45, "admin": true } ] 

运行如下:

 docker-compose up docker-compose exec mongodb mongo > use example-db > db.MyDummyCollection.find() { "_id" : ObjectId("592f5496fcdcafc0a8e0e0c8"), "name" : "Joe Smith", "email" : "jsmith@gmail.com", "age" : 40, "admin" : false } { "_id" : ObjectId("592f5496fcdcafc0a8e0e0c9"), "name" : "Jen Ford", "email" : "jford@gmail.com", "age" : 45, "admin" : true } 

我从这里拿走了代码,但是我已经改进了它,而不需要用于种子的Dockerfile。