【问题标题】:Keeping alive Docker containers with supervisord使用 supervisord 维护 Docker 容器
【发布时间】:2015-12-01 20:59:07
【问题描述】:

我用以下几行结束我的 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 文件变得复杂,所以我尝试将预启动命令移动到容器中,以便在任何类型的启动时自动运行.

这个docker容器以后会有nginx、php、ssh、phpmyadmin和mysql。我不想要多个容器。

感谢您的帮助!

【问题讨论】:

    标签: docker supervisord systemd


    【解决方案1】:

    让我们先说在 docker 容器中运行厨房水槽不是最佳做法。 Docker 不是虚拟机。

    也就是说,有一些问题。

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

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

    【讨论】:

    • 使用 Docker 的规范方式是每个容器 1 个进程。您可以使用 docker-compose @lanti 轻松做到这一点
    • 我明白了。所以我可以将 PHP+Nginx 容器与 MySQL 容器连接起来吗?将 nginx + php 放在同一个容器中是个好主意吗?我从主管那里放弃了 systemd。我遵循了一个不适合 docker 的教程。现在主管也启动了 php-fpm。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2015-10-28
    相关资源
    最近更新 更多