2016-10-18 57 views
6

我在撰写创建一个蒙戈容器:搬运工,撰写创建蒙戈容器中的用户名和密码

version: '2' 
volumes: 
    mongodata: 
    driver: local 
services: 
    mongo: 
    image: mongo:latest 
    hostname: ${MONGODB_HOST} 
    restart: always 
    ports: 
     - "27017:27017" 
    volumes: 
     - mongodata:/data/db 

这完美的作品,但是现在我想提出一个密码数据库。为此,首先据我所知,我需要创建数据库,添加密码,然后用--auth标志重新启动它。我的问题是如何用docker-compose完成这个过程。

我可以做到这一点,如果我做的一切都没有码头撰写。我能看到的问题包括:

a)docker-compose在码头网络中工作。 b)docker-compose在生产过程中不能在开始时运行不同的命令。 - 这很重要,因为尽管有些人说你可以在开始时运行--auth,并且它可以让你第一次设置密码,但似乎并不是这样。

一个解决方案,我开始工作的是一个shell脚本,我会跑码头工人,撰写文件之前,我的所有服务器上运行:

# start the temporary container 
docker run -d -v /tmp/mongodb --name tmpdb -e MONGODB_DBNAME=db_test mongo --auth 
# do the user creation 
docker run -it --link tmpdb --rm mongo sh -c 'mongo --host tmpdb --eval "db.createUser({ user: \"admin\", pwd: \"password\", roles: [ { role: \"root\", db: \"admin\" } ] });"' 
# stop the server 
docker stop tmpdb 
# create new mongodb container, using the old ones data 
docker run -d -p 27017:27017 --name mongo2 -e MONGODB_DBNAME=db_test mongo --auth 
# clean up old container (we are using the volumes so they will stick around) 
docker rm tmpdb 

此文件创建一个临时容器,它设置一个用户名/密码,停止原始容器,使用旧容器创建新容器,并删除原始容器。新的mongo容器现在有一个密码。

所以我最终的问题是,在docker-compose中做这件事的最好方法是什么?

我在我的搬运工,撰写文件等容器必须能够访问蒙戈,所以我觉得体积集装箱保持蒙戈数据需要的泊坞窗,撰写创建

回答

1

蒙戈在同一网络中:撰写本文时的最新图片(v 3.5)接受两个环境变量,MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD

当这些设置完成后,容器的入口点脚本将使用--auth启动mongod服务,然后使用提供的凭证创建一个管理员用户。

这是目前没有在他们的README记载,但有对此事GitHub issue跟踪进度,并提供源代码的docker-entrypoint.sh脚本104线。

要在docker-compose.yml使用这些变量,见下面的代码片段:

version: '3' 
services: 
    mongodb: 
    image: mongo:3.5 
    hostname: ${MONGODB_HOST} 
    environment: 
     - MONGO_INITDB_ROOT_USERNAME=alice 
     - MONGO_INITDB_ROOT_PASSWORD=super-secret-password 
    restart: on-failure 
    ports: 
     - 27017:27017 
    volumes: 
     - ./mongodb:/data/db 
相关问题