sudo docker run -d --name mongodb -p 27017:27017 -v 你的配置目录:/data/configdb -v 你的数据目录:/data/db mongo
这段命令相信会docker的同学来说应该不陌生,如果有不懂的同学,可以先学习相关知识。
记住上面是没有加 --auth
的,因为如果上面加了 --auth , 你后面进入容器内部,进行添加用户等操作 的时候,就需要认证,但是你是第一次启动,肯定是没有用户的,所以认证不了,你就操作不了,创建不了用户。
正确的做法:
就是执行上面的 docker run 命令后 , 这个时候记住,你是不需要权限认证的,直接进入容器内部,进入mongodb 里,创建用户。
这个时候,你虽然创建了用户,但是你仍然没有开启认证,因为你docker run 的时候没有指定 --auth
,所以这也是 docker 在执行力方面的一个缺点吧,有很多功能需要自己摸索。
重点来了
记住,先提醒一句,可以去dockerhub上面看看每个docker的作者,都会在DockerFile结尾指定 entrypoint.sh脚本的位置,这个entrypoint.sh脚本的作用其实就是配置相应镜像的脚本
,mongodb当然也不例外:
如上图,就是mongodb DockerFile的一部分,可以看到DockerFile配置了我上面第一段命令的 mongodb的配置文件目录,数据目录。而这里最重要的就是 entrypoint.sh 的目录,在容器内部,你需要找到这个文件,并编辑它
。但是容器内部是不能使用vi,vim等指令的,又一个但是你还记的我们上面doceker run 的参数不: -v 你的配置目录:/data/configdb -v 你的数据目录:/data/db
这两个位置是共享容器内部的位置的,所以你又需要把entrypoint.sh文件拷贝到 这两个目录的data/db目录下,一定要是这个,如果你拷到配置文件目录下,可能会出麻烦。
先整理一下思绪:我们开启了容器,并把我们相应的配置目录和数据目录挂载到了容器里,然后在容器的mongodb里创建了我们的角色,但是由于我们在开启容器的时候,没有指定 --auth 参数,所以即使创建了角色,也认证不了。于是我们需要编辑 entrypoint.sh 文件,但是容器内部没有vi,vim等命令,所以我们需要把entrypoint.sh 文件拷贝到宿主机和容器挂载的数据目录
。
然后我们退出容器,进入宿主机挂在的数据目录,编辑这个entrypoint.sh文件如下:
在exec gosu mongodb "$@"之前增加一行内容 set -- "$@" "--auth"
OK,此时我们就编辑完成了。然后我们需要重新进入容器内部,把这个 编辑完成的 entrypoint 文件,从共享目录直接移动到原目录,上面的那张图片上的位置
,覆盖掉原来的entrypoint.sh文件。
大功告成,退出容器,重新启动
docker restart mongodb 就 欧了,重新进入容器,再操作试试,保证要你验证。