我用这些行结束我的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。我不想要多个容器。
感谢您的帮助!
答案 0 :(得分:2)
让我们在前言中说,在码头工作容器中运行厨房水槽并不是最好的做法。 Docker不是虚拟机。
那就说了几个问题。
就像主管控制的进程一样,主管本身也不应该守护进程。添加-n
我不完全确定您为什么期望,需要或想要让systemd和supervisor运行。大多数docker容器没有正常运行的init系统。为什么不只是用户主管的一切?除非docker在最后几个版本中发生了重大变化,否则容器内的systemd将无法像您认为的那样工作。