docker容器内设置开机启动程序

在 docker 里用 PHP + Apache 的环境做 web 服务器,想在容器启动时自动运行一个其它的程序(已手动安装),从网上搜索,尝试了好久,终于找到了可以接受的方法,在此记录。

镜像用的 php:7.2-apache,里面操作系统是 Debian。开始搜索的方向一直是如何给 Debian 设置开机启动,方向偏了。

Debian 旧版本:在 /etc/rc.local 文件中 exit 0 之前的位置添加自己需要的命令。

Debian 新版本:在 /etc/init.d/ 下新建符合格式要求的脚本文件,然后用 update-rc.d 命令设置脚本运行的优先级。

这两种方法我都遇到了各种问题。

第一种方法需要先添加 rc.local 服务,这步没问题,但是之后需要用 systemctl 启用并启动这个服务。在容器中用 systemctl 的话需要在容器启动时添加额外的参数,因为我用的 docker composer,感觉很麻烦,放弃了。

第二种方法按搜到的各种步骤做完之后,自定义的脚本没有被添加到各个 /etc/rcX.d/ 目录下,可能因为没使用 systemctl 命令,也可能因为这个容器修改了操作系统的配置,进行了限制(修改 /usr/sbin/policy-rc.d 的返回值不管用)。后来没再细究。

之后又尝试在 docker-compose.yml 中用 CMD 命令覆盖容器默认的启动命令,可能是命令写的不对,导致容器启动不了了。

这时,想到了现在我用的方法。

把自定义的启动命令写到容器自带的启动文件里。 php:7.2-apache 这个镜像是 /usr/local/bin/docker-php-entrypoint