Mongodb 安装在 Ubuntu 14.04 docker 容器中失败

Pau*_*aul 6 mongodb docker ubuntu-14.04

我正在尝试使用 Dockerfile 中官方 mongodb 指南中的以下步骤在 docker 容器中的 ubuntu 14.04 上安装 mongodb:

RUN sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
RUN echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
RUN apt-get update && apt-get -q -y install \
    nodejs\
    npm \
    git \
    mongodb-org
Run Code Online (Sandbox Code Playgroud)

这些命令在我的主机 ubuntu 系统上正确安装 mongodb,但不在 docker 中。在我的 docker 镜像中, /etc/init.d/mongod 不存在。运行“docker build”时打印以下错误:

invoke-rc.d: unknown initscript, /etc/init.d/mongod not found.
invoke-rc.d: policy-rc.d denied execution of start.
Run Code Online (Sandbox Code Playgroud)

小智 5

参考:堆栈溢出

如上所述,原因是您尝试安装为 Upstart init 服务打包的版本,但 ubuntu 14.04 仍然默认使用 SysV init。推荐的方法是使用更高版本的 3.2.x 从这里或者如果你对版本很严格,修复是使用

deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen
Run Code Online (Sandbox Code Playgroud)

代替

deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse
Run Code Online (Sandbox Code Playgroud)

此外,要在使用docker run -d启动时运行mongod ,您需要向其添加 CMD。所以,我修改并编译了一个 docker 文件来测试这个,看起来像这样:

FROM ubuntu:14.04

RUN sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 \
  && echo "deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list \
  && apt-get update && apt-get -q -y install \
    nodejs\
    npm \
    git \
    mongodb-org 

CMD ["mongod", "--dbpath", "."]
Run Code Online (Sandbox Code Playgroud)

请注意,我没有使用 init 来启动容器,因为 init 脚本将 mongod 置于后台(除了许多其他事情之外)。为了让 docker 容器持续运行,CMD 脚本应该在前台。

来自 /etc/init.d/mongod start() 的剪辑注意那里的--background

    # Start the process using the wrapper
    start-stop-daemon --background --start --quiet --pidfile $PIDFILE \
                --make-pidfile --chuid $DAEMONUSER \
                --exec $NUMACTL $DAEMON $DAEMON_OPTS
Run Code Online (Sandbox Code Playgroud)