我正在玩MongoDB和Docker,此时我正在尝试为自己创建一个有用的图像供我在工作中使用。我创建了以下Dockerfile
:
FROM mongo:2.6
MAINTAINER Reynier Perez <reynierpm@gmail.com>
VOLUME /data/db /data/configdb
CMD ["mongod"]
EXPOSE 27017
我已将其添加到我的docker-compose.yml
文件中:
version: '2'
services:
### PHP/Apache Container
php-apache:
container_name: "php55-dev"
image: reynierpm/php55-dev
ports:
- "80:80"
environment:
PHP_ERROR_REPORTING: 'E_ALL & ~E_DEPRECATED & ~E_NOTICE'
volumes:
- ~/mmi:/var/www
- ~/data:/data
links:
- mongodb
### MongoDB Container
mongodb:
container_name: "mongodb"
build: ./mongo
environment:
MONGODB_USER: "xxxx"
MONGODB_DATABASE: "xxxx"
MONGODB_PASS: "xxxx"
ports:
- "27017:27017"
volumes:
- ~/data/mongo:/data/db
我对这个设置有一些疑问:
答案 0 :(得分:3)
在挂载主机目录时不需要我是否需要在Dockerfile上使用VOLUME / data / db / data / configdb,或者足以在docker-compose.yml上使用〜/ data / mongo:/ data / configdb这一行?
VOLUME
,但它作为元数据很有用。安装Docker卷(非主机目录)时,VOLUME
确实提供了一些特殊的“卷创建复制数据”语义,这将影响您的数据初始化方法选择。
我假设(并且我从这里开始)我一旦构建了Mongo图像,我将创建一个数据库并使用密码为用户提供完全权限,因为它在环境变量上?我是对的? (我在这里找不到任何有用的东西)
MONGO_USER
,MONGO_DATABASE
和MONGO_PASS
不会在official mongo Docker image或mongod
本身做任何事情。
mongo图像增加了对类似环境变量的支持:
MONGO_INITDB_ROOT_USERNAME
MONGO_INITDB_ROOT_PASSWORD
MONGO_INITDB_DATABASE
如何将当前的mongo备份(多个JSON文件)导入应该在mongo容器上创建的数据库?我相信我需要运行mongorestore命令,但是如何?我是否需要创建一个脚本并在每次容器启动时运行它?或者我应该在图像构建期间运行?什么是最好的方法?
是否在构建或运行时初始化数据取决于您的使用情况。如前所述,Docker可以将指定VOLUME
的数据复制到它创建的卷中。如果要挂载主机目录,则可能需要在运行时进行初始化。
mongorestore
需要正在运行的服务器才能还原到。在构建期间,您需要launch the server and restore in the same RUN
step。在运行时,您可能需要包含一个检查数据库是否存在的启动脚本。
Mongo能够将任何空目录初始化为空白mongo实例,因此您无需担心mongo无法启动。