我在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里面运行时启动它就可以了......
发生了什么事?
答案 0 :(得分:14)
答案 1 :(得分:5)
如果您正在寻找一个与初始系统完全相同的Docker镜像,请查看phusion baseimage
答案 2 :(得分:3)
现在我在几个小时的工作中跟踪了这个错误。
问题的原因是start-stop-daemon
,debian系统的主要守护程序启动器/测试器/停止工具,通过检查{{1}中守护程序进程的虚拟软链接来检查守护程序是否存在(它应该指向启动过程的二进制图像。)
现在的问题是,在docker中,这个软链接默认不会起作用。这是因为docker必须在默认安装中使用严格的安全策略(它主要用于运行未识别的软件)。
该任务有许多变通方法,有些需要更改容器的权限设置,有些则不需要。两个例子:
/proc/<pid>/exe
和start-stop-daemon
标记不使用--test
--exec
命令提供--cap-add=SYS_ADMIN
选项来启动docker容器(不用担心,它不会为您的docker容器提供任何sysadm权限,它可能只是预防性生产用途)除了这些之外,docker run
在docker中也不起作用,尽管它可能更像是systemd的缺点,就像docker一样。 <{1}}代替systemd
,upstart可用。
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.sh
在Dockerfile
中运行并运行以下脚本:
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