保持与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将不会像你想象的那样工作。