在 Dockerfile 中设置 mongoDB
Setting up a mongoDB in a Dockerfile
我尝试在 Dockerfile 中设置 mongodb。
这是来自我基于 Debian 的 dockerfile:
...mongoDB is installed here
#start the mongoDB
RUN mongod --fork --logpath /var/log/mongod.log
RUN mongo --eval "db.getSiblingDB('db')"
当我尝试构建此 Dockerfile 时出现以下错误:
connecting to: mongodb://127.0.0.1:27017
W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused
E QUERY [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed : connect@src/mongo/shell/mongo.js:251:13
@(connect):1:6
exception: connect failed
如果有人知道如何解决这个问题,那就太好了。
问题与 Docker 如何处理 Docker 文件有关。 Docker 文件中的每条语句都在一个容器中执行,该容器是根据上一行的映像创建的。在 RUN
语句的情况下,Docker 运行 是容器中的代码,并根据容器的当前状态创建新图像。该图像不包含有关 运行ning 进程的任何信息。
在您的情况下,这意味着您有一个映像,其中包含 mongodb
安装。我们称它为 A
(而不是 docker build
日志中的散列值)。第一个RUN
语句
RUN mongod --fork --logpath /var/log/mongod.log
是在一个容器中处理的,姑且称之为a
,它是基于镜像A
。 a
中的进程 mongod
可能会向日志文件附加几行。处理完 RUN
语句后,容器的文件系统将被冻结并标记为映像 B
。 Docker 图像不包含有关 运行ning 进程的任何信息。事实上,在这一点上,已经没有 mongod
进程 运行ning 了。但是,图像 B
包含来自之前 RUN
.
的日志条目
第二个RUN
语句
RUN mongo --eval "use db"
在基于镜像B
的容器b
中执行。此命令失败,因为没有 mongo
可以与之通信的 运行ning 进程。
我认为有两种方法可以解决您的问题:
一般来说,您可以运行一步完成两个脚本
RUN mongod --fork --logpath /var/log/mongod.log && mongo --eval "use db"
或将它们移动到 bash 脚本,以便它们在同一容器中执行。
使用官方mongo
image on Docker hub.
我尝试在 Dockerfile 中设置 mongodb。
这是来自我基于 Debian 的 dockerfile:
...mongoDB is installed here
#start the mongoDB
RUN mongod --fork --logpath /var/log/mongod.log
RUN mongo --eval "db.getSiblingDB('db')"
当我尝试构建此 Dockerfile 时出现以下错误:
connecting to: mongodb://127.0.0.1:27017
W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused
E QUERY [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed : connect@src/mongo/shell/mongo.js:251:13
@(connect):1:6
exception: connect failed
如果有人知道如何解决这个问题,那就太好了。
问题与 Docker 如何处理 Docker 文件有关。 Docker 文件中的每条语句都在一个容器中执行,该容器是根据上一行的映像创建的。在 RUN
语句的情况下,Docker 运行 是容器中的代码,并根据容器的当前状态创建新图像。该图像不包含有关 运行ning 进程的任何信息。
在您的情况下,这意味着您有一个映像,其中包含 mongodb
安装。我们称它为 A
(而不是 docker build
日志中的散列值)。第一个RUN
语句
RUN mongod --fork --logpath /var/log/mongod.log
是在一个容器中处理的,姑且称之为a
,它是基于镜像A
。 a
中的进程 mongod
可能会向日志文件附加几行。处理完 RUN
语句后,容器的文件系统将被冻结并标记为映像 B
。 Docker 图像不包含有关 运行ning 进程的任何信息。事实上,在这一点上,已经没有 mongod
进程 运行ning 了。但是,图像 B
包含来自之前 RUN
.
第二个RUN
语句
RUN mongo --eval "use db"
在基于镜像B
的容器b
中执行。此命令失败,因为没有 mongo
可以与之通信的 运行ning 进程。
我认为有两种方法可以解决您的问题:
一般来说,您可以运行一步完成两个脚本
RUN mongod --fork --logpath /var/log/mongod.log && mongo --eval "use db"
或将它们移动到 bash 脚本,以便它们在同一容器中执行。
使用官方
mongo
image on Docker hub.