Docker 容器自启动服务的问题 update-rc.d 与 policy-rc.d

最近希望在 docker 容器中放点 crontab 启动脚本,发现几个问题:

  1. cron 服务是需要手动安装的
  2. cron 服务默认不启动

所以:

  1. 我们在 Dockefiles 里面首先要安装 cron:apt-get install -y cron
  2. 执行任务的脚本需要写入:echo "*/1 * * * * root echo 'run per minute!'" >> /etc/crontab
  3. 启动 cron 的自启动:update-rc.d cron defaults 99

但是,这个 update-rc.d 并没有生效,原因找了很多地方,最终得到结果:

https://groups.google.com/d/msg/docker-dev/YmMHFFIeH5M/FWn_gge01XIJ

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

主要是第二篇,大致是说,在执行 update-rc.d 任务的时候,会先运行一下 /usr/sbin/policy-rc.d 任务(如果有)。

如果返回值是 0,那么 OK,执行任务,如果返回值是 101,那么不好意思,任务不执行。

事实上 Docker 在容器里面就直接返回了个 101,所以执行 update-rc.d 的时候根本没用。

为了放行服务的自启动,我们需要修改一下这个脚本,看下面,我们只需要将原来的 exit 101 改成 exit 0 即可。

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

这个也可以放在 Docker 的构建环节里面进行,改完上面这个脚本之后,可以继续在 Dockerfile 里面执行:

update-rc.d cron defaults 99

这样就可以完美解决自启动和定时计划的问题了。


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2016/05/docker-cron-startup.html【Docker 容器自启动服务的问题 update-rc.d 与 policy-rc.d】

发表评论

电子邮件地址不会被公开。 必填项已用*标注