2017-06-01 60 views
3

我想用已经设置好的用户和基本数据库结构(从Dockerfile)构建一个mongodb容器。Mongodb Docker - 创建初始用户并设置初始结构

这里是我的Dockerfile:

FROM mongo:latest 

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

(精缩它用于测试目的)。

我不断收到错误:

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 : 
[email protected]/mongo/shell/mongo.js:237:13 
@(connect):1:6 
exception: connect failed 

...和容器构建失败。我甚至不知道如何检查日志,因为我是从Dockerfile构建的,一旦容器无法构建,就无法进入内部检查日志。

不过,如果我删除运行命令和手动操作:

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

...它的工作原理。

我已经尝试将所有权设置为mongodb:mongodb并尝试将〜/ db目录中的日志和db路径移动至未成功。 PS:我正在使用docker-compose。想用docker-compose做到这一点,所以开发人员不必自己管理事情。

这里是码头工人,撰写段:

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 : 
[email protected]/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 
+0

Mongo在容器内部监听的端口是什么?似乎它不绑定到端口27017。 –

+0

Afaik父Dockerfile确实让它在27017/27018/27019上侦听。还是我误会了? – user3271166

+0

对不起,没有用localhost:27017解析命令行。可能会尝试绑定到0.0.0.0:27017 –

回答

1

您可以使用稍微不同的方法。您可以在第一次启动时向数据提供数据。您可以使用辅助容器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": "[email protected]gmail.com", 
    "age": 40, 
    "admin": false 
    }, 
    { 
    "name": "Jen Ford", 
    "email": "[email protected]", 
    "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" : "[email protected]", "age" : 40, "admin" : false } 
{ "_id" : ObjectId("592f5496fcdcafc0a8e0e0c9"), "name" : "Jen Ford", "email" : "[email protected]", "age" : 45, "admin" : true } 

我把代码here,但我已经没有改进它需要为种子提供Dockerfile。

+1

谢谢,以后再说吧 – user3271166