【问题标题】:Mongodb Docker - Creating initial users and setting up initial structuresMongodb Docker - 创建初始用户并设置初始结构
【发布时间】:2017-06-01 14:56:05
【问题描述】:

我正在尝试使用已设置的用户和基本数据库结构(来自 Dockerfile)构建一个 mongodb 容器。

这是我的 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 :
connect@src/mongo/shell/mongo.js:237:13
@(connect):1:6
exception: connect failed

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

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

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

...它有效。

我尝试将所有权设置为 mongodb:mongodb 并尝试将日志和数据库路径移动到 ~/db 目录但没有成功。

PS:我正在使用 docker-compose。想用 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 :
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 在容器内监听的端口是什么?好像它没有绑定到端口 27017。
  • Afaik 父 Dockerfile 确实让它在 27017/27018/27019 上侦听。还是我弄错了?
  • 是的,抱歉,没有使用 localhost:27017 解析命令行。可能会尝试绑定到 0.0.0.0:27017
  • 试过了,说Couldn't connect to server。另外,请在帖子中检查上面的编辑。

标签: mongodb docker docker-compose dockerfile


【解决方案1】:

您可以使用稍微不同的方法。您可以在第一次启动时向 mongo 提供数据。您可以使用辅助容器 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 }

我从here 获取代码,但我已经对其进行了改进,而不需要种子的 Dockerfile。

【讨论】:

  • 谢谢,稍后再试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多