其实Docker的宗旨是一个容器,一个业务,但很多东西并没有这么理想化。

比如有个小需求就是在Nginx、Lighttpd的容器里跑起crond,定期调用logrotate切割一下log文件。

用母机的crontab可能反倒好实现,直接执行一个docker语句就可以,但是这样迁移有点麻烦,用crond单独一个容器的话,我不知道要怎么垮过容器去调用一个脚本??

所以自己各种尝试最后用entrypoint一个sh文件的方式实现了同时跑Lighttpd和crond:

Start.sh文件

#!/bin/sh
/usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf &
/usr/sbin/crond -f

Dockerfile里

...
RUN apk --no-cache add logrotate
ADD start.sh /root/
ENTRYPOINT ["/root/start.sh"]
...

这样就实现了启动后,/root/start.sh里两个子进程,Lighttpd和crond,就是不知道这样是否会有什么隐患。

按照google出来的方法,应该安装一个supervisor,且Docker本来就很不提倡这种一个容器2个进程的行为。