首页 > 解决方案 > 使用 docker-compose 启动 mongo docker

问题描述

我的 docker 容器正在通过 docker-compose 运行。由于此日志行,init 脚本似乎正在创建我要登录的用户:

mongo    | Successfully added user: { "user" : "newUser", "roles" : [ "readWrite" ] }
mongo    | bye
mongo    | Error saving history file: FileOpenFailed Unable to open() file /home/mongodb/.dbshell: No such file or directory
mongo    | {"t":{"$date":"2021-01-29T13:45:03.397+00:00"},"s":"I",  "c":"NETWORK",  "id":22944,   "ctx":"conn3","msg":"Connection ended","attr":{"remote":"127.0.0.1:60066","connectionId":3,"connectionCount":0}}

但是,由于我看到“无法打开文件 /home/mongodb/.dbshel​​l”,看来我无法写入我的数据目录。知道我在这里做错了什么吗?

这是 mongo 的 docker-compose:

mongo:
  image: mongo:4.4.3
  container_name: mongo
  restart: unless-stopped
  environment:
    MONGO_INITDB_ROOT_USERNAME: root
    MONGO_INITDB_ROOT_PASSWORD: root1
    MONGO_INITDB_DATABASE: admin
  command: mongod --port 27017
  ports:
    - '27017:27017'
  volumes:
    - ./data/mongodb:/data/db
    - ./configs/mongodb/mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro

这是我的 mongo-init.sh 文件。

#!/usr/bin/env bash
set -eu
mongo -- "admin" <<EOF
    var rootUser = 'root';
    var rootPassword = 'root1';
    var admin = db.getSiblingDB('admin');
    admin.auth(rootUser, rootPassword);

    var user = 'newUser';
    var passwd = 'newUserPass';
    db.createUser({user: user, pwd: passwd, roles: ["readWrite"]});
EOF

标签: mongodbdockerdocker-compose

解决方案


我发现了问题。我的脚本中有两个地方错了。MONGO_INITDB_DATABASE 在我的 docker-compose 中不应该是管理员 - 它应该是我试图创建的数据库。mongo-init.sh 文件也应该是这样的:

mongo -- "newUserDB" <<EOF
    var admin = db.getSiblingDB('admin');
    admin.auth('root', 'root1');
    db.createUser({user: 'newUser', pwd: 'newUserPass', roles: [{ role: "readWrite", db: "newUserDB" }]});
EOF

我注意到我的用户是在错误的数据库中创建的。上面的错误让我失望。那和本地卷的所有者是 systemd-coredump,这完全没问题,因为这只是 Mongo 在容器中使用的用户 ID 的映射。与实际的核心转储无关。少!


推荐阅读