对于开发堆栈,我想通过docker-compose设置mongo的docker-container。在它的构建中,我想用一些开发数据初始化数据库,以便堆栈工作。
然而根据mongo's documentation,我似乎只能找到一个手动过程:
Start the Database
$ docker run --name some-mongo -d mongo --auth
Add the Initial Admin User
$ docker exec -it some-mongo mongo admin
connecting to: admin
> db.createUser({ user: 'jsmith', pwd: 'some-initial-password', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
Successfully added user: {
"user" : "jsmith",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
我正在寻找一种方法,告诉图像在构建过程中只运行一次查询,以便初始化开发环境。
基本上,我正在努力实现与mariadb image offers:
类似的东西初始化新实例
当容器启动时 第一次,将创建一个具有指定名称的新数据库 使用提供的配置变量初始化。而且,它 将执行扩展名为
.sh
,.sql
和.sql.gz
的文件 在/docker-entrypoint-initdb.d
中找到。文件将在中执行 按字母顺序。您可以轻松填充mariadb
服务 将SQL转储装入该目录并提供自定义映像 贡献数据。 SQL文件默认导入到 由MYSQL_DATABASE
变量指定的数据库。
现在我意识到docker不是魔法,而且这是mariadb的一个功能,不一定是mongo,我仍然希望实现一个类似的想法,并想知道如何实现这一点。
答案 0 :(得分:0)
我写了一个脚本,它启动了我的docker mongo container
。
我使用named volume
来存储mongo的数据 - 如果该卷不存在,则会创建它。在这种情况下,在脚本中执行以下命令以初始化mongo容器。
docker exec "$container_name" mongo admin --eval 'db.createUser({user: "admin", pwd: "password", roles:[{role:"userAdminAnyDatabase",db:"admin"}]});'
直到现在,我找不到更好的解决方法。
以前,我手动创建了用户并备份了卷的数据。初始化mongo容器时。然后我在部署时将该备份恢复到容器中。
我发现这包含太多的手动步骤。
<强>更新强>:
tutum/mongodb图片具有预设的管理员用户,并且还使用环境变量来设置用户。
实际上,Bret Fisher是对的 - 在图像中这样做是最好的方法。
答案 1 :(得分:0)
处理此问题的最佳方法,如官方postgres,mysql和mariadb数据库,通过ENTRYPOINT shell脚本。 Here's the latest one for mariadb
您可以在图像本身或Hub中通过单击Dockerfile链接找到这些,然后单击pwd的GitHub面包屑,因为Hub官方图像标准是同一GitHub目录中的入口点脚本通常具有Dockerfiles。
在执行CMD之前,首先在每个容器启动时启动Entrypoint脚本。 Entrypoint实际工作的方式稍微有些细微差别,但是here's some info in the Docs。
通常,这些入口点脚本根据您设置的环境变量为所有官方数据库执行相同的任务集:
您会注意到这些官方图片有各种各样的环境来定制所有这些操作。
您可以从其中一个开始,然后更改运行的命令以适用于mongo。高级自定义图像使用可能会根据您创建和设置的一些envvar以及添加样本数据索引来提取样本数据。这种自动化水平非常适合在本地使用docker进行开发的团队,因为他们只需docker-compose up
就可以完全为他们设置示例环境,而无需手动exec
。