Docker.io init.d脚本无法启动容器

时间:2014-11-14 20:53:22

标签: ubuntu openerp docker odoo init.d

我在dir" / opt / odoo /"上有一个odoo的容器。

" /etc/init.d/odoo-server"上的init脚本;

#!/bin/bash
### BEGIN INIT INFO
# Provides:          odoo
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start openerp daemon at boot time
# Description:       Enable service provided by daemon.
# X-Interactive:     true
### END INIT INFO
## more info: http://wiki.debian.org/LSBInitScripts

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
DAEMON=/opt/odoo/openerp-server
NAME=odoo
DESC=odoo
CONFIG=/etc/odoo-server.conf
LOGFILE=/var/log/odoo/odoo-server.log
PIDFILE=/var/run/${NAME}.pid
USER=odoo
export LOGNAME=$USER

test -x $DAEMON || exit 0
set -e

function _start() {
    start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid $USER:$USER --background --make-pidfile --exec $DAEMON -- --config $CONFIG --logfile $LOGFILE
}

function _stop() {
    start-stop-daemon --stop --quiet --pidfile $PIDFILE --oknodo --retry 3
    rm -f $PIDFILE
}

function _status() {
    start-stop-daemon --status --quiet --pidfile $PIDFILE
    return $?
}


case "$1" in
        start)
                echo -n "Starting $DESC: "
                _start
                echo "ok"
                ;;
        stop)
                echo -n "Stopping $DESC: "
                _stop
                echo "ok"
                ;;
        restart|force-reload)
                echo -n "Restarting $DESC: "
                _stop
                sleep 1
                _start
                echo "ok"
             ;;
        status)
                echo -n "Status of $DESC: "
                _status && echo "running" || echo "stopped"
                ;;
        *)
                N=/etc/init.d/$NAME
                echo "Usage: $N {start|stop|restart|force-reload|status}" >&2
                exit 1
                ;;
esac

exit 0

然后我做

root@cca438c81a87:/# update-rc.d odoo-server defaults
 Adding system startup for /etc/init.d/odoo-server ...
   /etc/rc0.d/K20odoo-server -> ../init.d/odoo-server
   /etc/rc1.d/K20odoo-server -> ../init.d/odoo-server
   /etc/rc6.d/K20odoo-server -> ../init.d/odoo-server
   /etc/rc2.d/S20odoo-server -> ../init.d/odoo-server
   /etc/rc3.d/S20odoo-server -> ../init.d/odoo-server
   /etc/rc4.d/S20odoo-server -> ../init.d/odoo-server
   /etc/rc5.d/S20odoo-server -> ../init.d/odoo-server

当我用docker启动docker时,启动odoo-server并没有启动,当我在docker /etc/init.d/odoo-server里面运行时启动它就可以了......

发生了什么事?

5 个答案:

答案 0 :(得分:14)

Docker容器通常没有正常运行的init系统。如果您只是运行单个服务 - 只需启动它。

如果您需要更复杂的内容,请查看supervisordrunit

容器不是虚拟机。

答案 1 :(得分:5)

如果您正在寻找一个与初始系统完全相同的Docker镜像,请查看phusion baseimage

答案 2 :(得分:3)

现在我在几个小时的工作中跟踪了这个错误。

问题的原因是start-stop-daemon,debian系统的主要守护程序启动器/测试器/停止工具,通过检查{{1}中守护程序进程的虚拟软链接来检查守护程序是否存在(它应该指向启动过程的二进制图像。)

现在的问题是,在docker中,这个软链接默认不会起作用。这是因为docker必须在默认安装中使用严格的安全策略(它主要用于运行未识别的软件)。

该任务有许多变通方法,有些需要更改容器的权限设置,有些则不需要。两个例子:

  • 您将初始化脚本更改为/proc/<pid>/exestart-stop-daemon标记不使用--test
  • 通过向--exec命令提供--cap-add=SYS_ADMIN选项来启动docker容器(不用担心,它不会为您的docker容器提供任何sysadm权限,它可能只是预防性生产用途)

除了这些之外,docker run在docker中也不起作用,尽管它可能更像是systemd的缺点,就像docker一样。 <{1}}代替systemdupstart可用。

P.s:码头工人开发者/拥护者经常说,&#34;容器不是虚拟机&#34;和类似的。但是,在日常体验中,两者之间没有那么强烈的区别,并且对于软件的高效停靠者使用,至少对类似VPS的功能的最小支持肯定是有用的。希望码头开发能够在不久的将来集中精力朝这个方向发展。

答案 3 :(得分:2)

我发现服务未启动是因为/usr/sbin/policy-rc.d返回101代码:

请参阅:http://jpetazzo.github.io/2013/10/06/policy-rc-d-do-not-start-services-automatically/

码头工人将其设置为在容器中返回101.

因此,在构建中更改该脚本将起作用,您可以使build.shDockerfile中运行并运行以下脚本:

cat << EOF > /usr/sbin/policy-rc.d
#!/bin/sh

# For most Docker users, "apt-get install" only happens during "docker build",
# where starting services doesn't work and often fails in humorous ways. This
# prevents those failures by stopping the services from attempting to start.

# exit 101
exit 0
EOF

答案 4 :(得分:-4)

看起来你的shebang不正确,而不是#!/ bin / bash它应该是#! / bin / sh的

请参阅:https://unix.stackexchange.com/questions/124566/how-to-debug-init-d-script-that-isnt-being-run