使用supervisord保持Docker容器的活力

时间:2015-12-01 20:59:07

标签: docker supervisord systemd

我用这些行结束我的Debian Dockerfile:

EXPOSE 80 22

COPY etc/supervisor/conf.d /etc/supervisor/conf.d
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]

/etc/supervisor/conf.d/start.conf档案中:

[program:ssh]
command=/usr/sbin/service ssh restart

[program:nginx]
command=/usr/sbin/nginx -g 'daemon off;'

[program:systemctl]
command=/bin/systemctl daemon-reload

[program:systemctl]
command=/bin/systemctl start php7-fpm.service

如果我尝试使用以下命令运行此Docker镜像:

$ docker run -d -p 8080:80 -p 8081:22 lanti/debian

它会立即停止运行。如果我尝试在前台运行它:

$ docker run -it -v /home/core/share:/root/share -p 8080:80 -p 8081:22 lanti/debian

它是一样的,立即退出。如果我使用bash CMD运行:

$ docker run --rm -it -v /home/core/share:/root/share -p 8080:80 -p 8081:22 lanti/debian bash

它在控制台中保持活动状态,但主管的预定义命令没有运行,因此我需要在容器内运行$ service supervisor restart,否则Nginx和SSH将无法启动。

如何在启动时运行多个命令启动docker容器?在过去,我在主机操作系统下的systemd文件中使用了ExecStartPost行,但由于这一点,systemd文件变得复杂,所以我尝试将预启动命令移动到容器中,以便在任何类型下自动运行启动。

这个docker容器将来会有nginx,php,ssh,phpmyadmin和mysql。我不想要多个容器。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

让我们在前言中说,在码头工作容器中运行厨房水槽并不是最好的做法。 Docker不是虚拟机。

那就说了几个问题。

  • 就像主管控制的进程一样,主管本身也不应该守护进程。添加-n

  • 我不完全确定您为什么期望,需要或想要让systemd和supervisor运行。大多数docker容器没有正常运行的init系统。为什么不只是用户主管的一切?除非docker在最后几个版本中发生了重大变化,否则容器内的systemd将无法像您认为的那样工作。