Ubuntu Docker.io init.d脚本在启动容器上不工作

Ubuntu Docker.io init.d脚本在启动容器上不工作,ubuntu,openerp,docker,odoo,init.d,Ubuntu,Openerp,Docker,Odoo,Init.d,我在dir“/opt/odoo/”上有一个容器 “/etc/init.d/odoo服务器”上的初始化脚本 那我会的 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-serv

我在dir“/opt/odoo/”上有一个容器

“/etc/init.d/odoo服务器”上的初始化脚本

那我会的

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 start启动docker时,odoo服务器不会启动,当我在docker/etc/init.d/odoo-server内部运行时,启动它工作正常


发生了什么?

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

如果你需要更复杂的东西,看看或


容器不是虚拟机。

如果您正在寻找一个Docker映像,它的行为非常类似于使用init系统的完整虚拟机,请看一看

看起来您的shebang不正确,而不是#/应该是#/垃圾箱/垃圾箱


请参阅:

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

见:

docker将其设置为返回容器中的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
cat/usr/sbin/policy rc.d
#!/垃圾箱/垃圾箱
#对于大多数Docker用户,“apt get install”仅在“Docker构建”期间发生,
#启动服务不起作用,常常以幽默的方式失败。这
#通过停止服务尝试启动来防止这些故障。
#101出口
出口0
EOF

现在我在几个小时的工作中找到了这个bug

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

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

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

  • 您可以将init脚本更改为不使用带有
    --test
    --exec
    标志的
    启动停止守护程序
  • 您可以通过为
    docker run
    命令提供
    --cap add=SYS\u ADMIN
    选项来启动docker容器(别担心,它不会给docker容器任何sysadm权限,这可能只是为了预防生产性使用)
除此之外,
systemd
在docker中也不起作用,尽管这可能是systemd的一个缺点,就像docker一样。可以使用,而不是
systemd



附言:docker开发者/拥护者经常说,“容器不是VM”之类的话。但是,在日常经验中,这两者之间并没有太大的区别,对于该软件的高效docker使用,至少对VPS类功能的最小支持肯定是有用的。希望docker的开发人员在不久的将来也会朝着这个方向努力。

我找到了将解决方案作为答案发布的要点:“容器不是虚拟机。”我找到了将解决方案作为答案发布的要点:不,添加空格对shebang行没有影响。请参见作为构建过程的一部分在Dockerfile中运行?因为我试过了。文件已更改,但如果说
/etc/init.d/postgresql
将无法启动,则在更改文件并重新启动容器后,此操作不起作用。
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