无法使用 docker 命令启动 mongo,但可以在容器内使用 /bin/bash(有数据量)
Can't start mongo with docker command, but can with /bin/bash inside container (with data volume)
这个docker-compose.yml
:
services:
database:
image: mongo:3.2
ports:
- "27017"
command: "mongod --dbpath=/usr/database"
networks:
- backend
volumes:
- dbdata:/usr/database
volumes:
dbdata:
导致此错误(截断):
database_1 | 2016-11-28T06:30:29.864+0000 I STORAGE [initandlisten] exception in initAndListen: 98 Unable to create/open lock file: /usr/database/mongod.lock errno:13 Permission denied Is a mongod instance already running?, terminating
同上,只是尝试 运行 容器中的命令直接使用该图像:
$ docker run -v /usr/database mongo:3.2 mongod --dbpath=/usr/database
但是,如果我 运行 /bin/bash
启动容器,然后启动 mongo
,我们就可以了:
$ docker run -it -v /usr/database mongo:3.2 /bin/bash
root@8aab722fad89:/# mongod --dbpath=/usr/database
根据输出,区别似乎在于在第二种情况下,命令是 运行 作为 root。
所以,我的问题是:
- 为什么
/bin/bash
方法有效,而其他方法无效?
- 如何在 docker-compose 中复制这个原因?
注意:在 OSX 上,因为这似乎会影响您是否可以将主机目录挂载为卷以供 Mongo 使用 - 而不是我这样做。
澄清一下,此图像 hub.docker.com/_/mongo 是来自 DockerHub 的官方 MongoDB docker 图像,而不是来自 MongoDB 的官方 docker 图像。
现在回答你的问题,
Why does the /bin/bash
method work, when the others do not?
此答案基于 Dockerfile v3.2。首先要指出的是,您的卷安装命令 -v /usr/database
实质上是在具有根所有权权限的容器中创建一个目录。
您的以下命令因 permission denied
失败,因为 docker 图像正在 运行 以用户 mongodb
的身份执行命令(请参阅 this dockerfile line)。由于目录 /usr/database
归 root
所有。
$ docker run -v /usr/database mongo:3.2 mongod --dbpath=/usr/database
而如果你在下面执行 /bin/bash
然后手动 运行 mongod
:
$ docker run -it -v /usr/database mongo:3.2 /bin/bash
您以root
的身份登录并以root
的身份执行mongod
,并且有在/usr/database/
中创建数据库文件的权限。
此外,如果您正在执行下面的行,它会起作用,因为您指向的目录 /data/db
已经为用户 mongodb
更正了权限(请参阅 this dockerfile line)
$ docker run -v db:/data/db mongo:3.2
How can I replicate that reason, in the docker-compose?
最简单的解决方案是使用 command: "mongod --dbpath=/data/db"
,因为权限所有权已在 Dockerfile 中更正。
如果您打算使用主机卷,您可能需要在主机 OSX 上添加 mongodb
用户并更改适当的目录权限。修改卷装载的权限所有权超出了 docker-compose 的范围。
这个docker-compose.yml
:
services:
database:
image: mongo:3.2
ports:
- "27017"
command: "mongod --dbpath=/usr/database"
networks:
- backend
volumes:
- dbdata:/usr/database
volumes:
dbdata:
导致此错误(截断):
database_1 | 2016-11-28T06:30:29.864+0000 I STORAGE [initandlisten] exception in initAndListen: 98 Unable to create/open lock file: /usr/database/mongod.lock errno:13 Permission denied Is a mongod instance already running?, terminating
同上,只是尝试 运行 容器中的命令直接使用该图像:
$ docker run -v /usr/database mongo:3.2 mongod --dbpath=/usr/database
但是,如果我 运行 /bin/bash
启动容器,然后启动 mongo
,我们就可以了:
$ docker run -it -v /usr/database mongo:3.2 /bin/bash
root@8aab722fad89:/# mongod --dbpath=/usr/database
根据输出,区别似乎在于在第二种情况下,命令是 运行 作为 root。
所以,我的问题是:
- 为什么
/bin/bash
方法有效,而其他方法无效? - 如何在 docker-compose 中复制这个原因?
注意:在 OSX 上,因为这似乎会影响您是否可以将主机目录挂载为卷以供 Mongo 使用 - 而不是我这样做。
澄清一下,此图像 hub.docker.com/_/mongo 是来自 DockerHub 的官方 MongoDB docker 图像,而不是来自 MongoDB 的官方 docker 图像。
现在回答你的问题,
Why does the
/bin/bash
method work, when the others do not?
此答案基于 Dockerfile v3.2。首先要指出的是,您的卷安装命令 -v /usr/database
实质上是在具有根所有权权限的容器中创建一个目录。
您的以下命令因 permission denied
失败,因为 docker 图像正在 运行 以用户 mongodb
的身份执行命令(请参阅 this dockerfile line)。由于目录 /usr/database
归 root
所有。
$ docker run -v /usr/database mongo:3.2 mongod --dbpath=/usr/database
而如果你在下面执行 /bin/bash
然后手动 运行 mongod
:
$ docker run -it -v /usr/database mongo:3.2 /bin/bash
您以root
的身份登录并以root
的身份执行mongod
,并且有在/usr/database/
中创建数据库文件的权限。
此外,如果您正在执行下面的行,它会起作用,因为您指向的目录 /data/db
已经为用户 mongodb
更正了权限(请参阅 this dockerfile line)
$ docker run -v db:/data/db mongo:3.2
How can I replicate that reason, in the docker-compose?
最简单的解决方案是使用 command: "mongod --dbpath=/data/db"
,因为权限所有权已在 Dockerfile 中更正。
如果您打算使用主机卷,您可能需要在主机 OSX 上添加 mongodb
用户并更改适当的目录权限。修改卷装载的权限所有权超出了 docker-compose 的范围。