2017-06-01 164 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