Ubuntu Docker.io init.d脚本在启动容器上不工作
我在dir“/opt/odoo/”上有一个容器 “/etc/init.d/odoo服务器”上的初始化脚本 那我会的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
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
选项来启动docker容器(别担心,它不会给docker容器任何sysadm权限,这可能只是为了预防生产性使用)--cap add=SYS\u ADMIN
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