首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过码头进行MongoDB和Docker -合成错误而不是使db无效

通过码头进行MongoDB和Docker -合成错误而不是使db无效
EN

Stack Overflow用户
提问于 2019-03-03 09:19:43
回答 1查看 2.8K关注 0票数 0

我是新来的码头工人,我读过蒙戈码头医生。我需要一些帮助来建立一个简单的应用程序。

我需要一个本地mongodb,它转储/使用一个名为"my_test_db“的数据库并将其写入<project-dir>/mongo/my_test_db

以下是我的简单项目:

代码语言:javascript
复制
# project structure
<project-dir>/
-- .env
-- docker-compose.yml
-- mongo/
-- + -- my_test_db/

.env文件:

代码语言:javascript
复制
# <project>/.env
MONGO_INITDB_ROOT_USERNAME=test_user
MONGO_INITDB_ROOT_PASSWORD=test_pwrd
MONGO_INITDB_DATABASE=my_test_db
MONGO_DATA_DIR=/mongo/my_test_db
MONGO_LOG_FILE=/mongo/mongodb.log

我在docker compose的尝试

代码语言:javascript
复制
#docker-compose.yml

version: '3'
services:
  mongodb:
    image: mongo:4.0

    # load env variables
    env_file:
      - .env 

    # map data_dir to host <project>/<data_dir>
    volumes:
      - ".${MONGO_DATA_DIR}:${MONGO_DATA_DIR}"

    expose:
      - 27017

    # set env vars with loaded vars (appears to be necessary for the user to be created, despite loading them with env_file)
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_DATABASE}
      MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE}

    # map ports
    ports:
        - 27017:27017
    command: "mongod --smallfiles"
    container_name: mongodb-test
# --logpath=.${MONGO_LOG_FILE} # when added to command fails

我有两个弹壳

代码语言:javascript
复制
#shell-1
<project-dir>$ docker-compose up

# I see my user created
# I see "MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=e19ea190b601" so my custom db isnt made on init...
代码语言:javascript
复制
#shell-2
# <project-dir>$ mongo 27017 --usernamne test_user --password test_pwrd # does fails to connect
<project-dir>$ mongo 27017 # connects



> db.getName()
# 27017 # so naming it didnt work

> show users
# Error: command usersInfo requires authentication

> use my_test_db
> db.myColl.insert({'name': 'test'})
# WriteCommandError({..., "codeName": "Unauthorized"})

我目前正在macOS上进行测试(因为docs声明这可能是相关的)

我做错了什么?我理解码头的概念,但我个人不使用它,因为这也是一个痛苦的使用.但我在努力学习。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-03 10:01:36

  • 对于身份验证部分:为了能够登录,您是否尝试过添加--authenticationDatabase admin
  • 关于MONGO_INITDB_DATABASE,除非您在/docker-entrypoint-initdb.d/下有一个脚本(如mongodb映像中使用的docker-entrypoiny.sh中所示),否则它不会有效,因此您可以在docker-entrypoint-initdb.d/中使用bash脚本。
  • 将根用户用作应用程序db的所有者并不是出于安全考虑,因为它将能够控制mongodb实例中的所有内容。 IMHO一种更好的方法是添加额外的变量,如下所示:
代码语言:javascript
复制
- `MONGO_APPLICATION_DATABASE`
- `MONGO_APPLICATION_USERNAME`
- `MONGO_APPLICATION_PASSWORD`

然后添加一个bash脚本,该脚本将创建用户并使用环境变量将其分配给数据库(您需要将其挂载到docker-entrypoint-initdb.d):

您可能需要根据需要更改用户角色。

initmongo/setup.sh mongo admin -u -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD -eval$MONGO_INITDB_ROOT_USERNAME‘$MONGO_USERNAME’,pwd:'$MONGO_APPLICATION_PASSWORD',角色:{role:‘ReadW区’,db:‘$MONGO_APPLICATION_DATABASE’};“

在docker-compose.yml中,向当前的卷列表中添加卷

#docker-compose.yml卷:- ".${MONGO_DATA_DIR}:${MONGO_DATA_DIR}“- "./initmongo/:/docker-entrypoint-initdb.d/”

最后,删除这个变量MONGO_INITDB_DATABASE,因为它不需要它。

为了登录,请使用以下命令:

用实际值替换变量

码头主管-it container_name mongo -u "$MONGO_APPLICATION_USERNAME“-p "$MONGO_APPLICATION_PASSWORD”--认证数据库"$MONGO_APPLICATION_DATABASE“"$MONGO_APPLICATION_DATABASE”

  • 对于.env文件,我不确定是什么导致了这个问题。你在使用它时有警告吗?还请考虑检查这句话
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54967329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档