DRYconfigurationDocker构build和应用程序

首先,这比我想象的要长得多,tl; dr; 我怎样才能让我的configurationDRY与docker(我假设与环境variables)

我正在开发一个mongodb数据库的node.js服务器,我正在切换到docker(希望)简化我的环境,并保持我的服务器一致。 让我开始说,我绝对不了解整个docker – 集装箱生命周期,但我正在学习。 经过大量的search后,我找不到解决scheme。 我正在使用适用于Windows的Docker和Hyper-V。 ( docker version在底部)

所以,我想能够configuration

  • 数据库名称
  • 数据库用户
  • 数据库密码
  • 应用端口
  • 和其他一些事情

并允许这些configuration的值在几个地方使用,包括

  • Docker构build阶段(设置数据库)
  • 节点应用程序(连接到数据库)

什么是能够设置数据库名称,用户和传递一次,并使用它来启动容器中的数据库,然后连接到它,每当容器被启动的最佳方式是什么?

当前设置

目前我有一个docker-compose文件,它是以下(./docker-compose.yml)

 version: "2" services: myapp: image: node:boron volumes: - ./dist:/usr/src/app working_dir: /usr/src/app command: sh -c 'npm install; npm install -g nodemon; nodemon -e js app.js' ports: - "9021:9021" depends_on: - mongo networks: - all mongo: build: ./build/mongo networks: - all networks: all: 

Mongo Dockerfile(./build/mongo/Dockerfile)

 # Image to make this from FROM mongo:3 # Add files into the container for db setup ADD initDB.js /tmp/ ADD createDBAdmin.js /tmp/ ADD mongod.conf /data/configdb # Map the host directory mongo/myapp to /data VOLUME /mongo/myapp:/data RUN ls /data/* RUN mongod -f /data/configdb/mongod.conf && sleep 5 && mongo ${DB_NAME} /tmp/createDBAdmin.js && sleep 5 && mongo ${DB_NAME} /tmp/initDB.js CMD mongod --smallfiles --storageEngine wiredTiger 

initDB.js脚本(./build/mongo/initdb.js)

 db.createUser( { user: "${DB_USER}", pwd: "${DB_PASS}", roles: [ { role: "dbOwner", db: "${DB_NAME}" } ] }, { w: "majority", wtimeout: 5000 } ); // For some reason this is needed to save the user db.createCollection("test"); 

docker version

 Client: Version: 1.13.0 API version: 1.25 Go version: go1.7.3 Git commit: 49bf474 Built: Tue Jan 17 21:19:34 2017 OS/Arch: windows/amd64 Server: Version: 1.13.0 API version: 1.25 (minimum version 1.12) Go version: go1.7.3 Git commit: 49bf474 Built: Wed Jan 18 16:20:26 2017 OS/Arch: linux/amd64 Experimental: true 

额外的积分如何在容器外持续保存数据库信息以备用途等,并查看文件? 我需要将我的主机上的一个目录映射到容器中的数据/数据库,我是否正确地做到这一点?

编辑:这似乎是一个很好的解决scheme,“额外信贷”的问题。 如何处理docker中的永久性存储(例如数据库)