保持与supervisord活着的Docker容器

我用这些行结束我的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 

它在控制台中保持活动状态,但由supervisor预定义的命令不运行,所以我需要在容器内运行$ service supervisor restart ,否则Nginx和SSH将不会启动。

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

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

感谢您的帮助!

让我们先说一下,在docker集装箱中运行厨房水槽不是最佳做法。 Docker不是一个虚拟机。

这就说了几个问题。

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

  • 我不完全确定你为什么期望,需要或想要systemd和supervisor运行。 大多数docker集装箱没有可用的init系统。 为什么不只是一切的用户主pipe? 除非在最后几个版本中docker已经发生了很大的变化,否则container里面的systemd将不会像你想象的那样工作。