Dokku多进程(容器)和Dockerfile项目

Dokku多进程(容器)和Dockerfile项目,docker,dockerfile,dokku,Docker,Dockerfile,Dokku,我正在研究并试图找出如何从一个项目中运行多个服务 我有一份带有Dockerfile的回购协议: FROM wjdp/flatcar ADD . app RUN /app/bin/install.sh EXPOSE 8000 CMD /app/bin/run.sh COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf CMD ["/usr/bin/supervisord"] run.sh启动单线程web服务器。这很好

我正在研究并试图找出如何从一个项目中运行多个服务

我有一份带有Dockerfile的回购协议:

FROM wjdp/flatcar

ADD . app

RUN /app/bin/install.sh

EXPOSE 8000

CMD /app/bin/run.sh
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord"]
run.sh
启动单线程web服务器。这很好,但我想运行几个服务

我试着用一行
web:/app/bin/run.sh创建一个
Procfile
并从Dockerfile中删除
CMD
行。如果没有运行Docker容器的命令,dokku将无法保持活动状态,dokku会感到悲伤:

remote: Error response from daemon: Cannot kill container ae9d50af17deed4b50bc8327e53ee942bbb3080d3021c49c6604b76b25bb898e: Container ae9d50af17deed4b50bc8327e53ee942bbb3080d3021c49c6604b76b25bb898e is not running
remote: Error: failed to kill containers: [ae9d50af17deed4b50bc8327e53ee942bbb3080d3021c49c6604b76b25bb898e]

你最好的办法可能是使用supervisord。Supervisord是一个非常轻量级的流程管理器

您可以使用CMD启动supervisord,然后将所有要启动的进程放入supervisord.conf文件中

有关更多信息,请参阅Docker文档:。最相关的摘录(摘自该页,但改写):

您可以将其放入Dockerfile中:

FROM wjdp/flatcar

ADD . app

RUN /app/bin/install.sh

EXPOSE 8000

CMD /app/bin/run.sh
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord"]
supervisord.conf文件将包含如下内容:

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"

显然,您还需要确保首先在映像中安装了supervisord。它是大多数发行版的一部分,因此您可能可以使用yum或apt-get安装它。

您最好的选择可能是使用supervisord。Supervisord是一个非常轻量级的流程管理器

您可以使用CMD启动supervisord,然后将所有要启动的进程放入supervisord.conf文件中

有关更多信息,请参阅Docker文档:。最相关的摘录(摘自该页,但改写):

您可以将其放入Dockerfile中:

FROM wjdp/flatcar

ADD . app

RUN /app/bin/install.sh

EXPOSE 8000

CMD /app/bin/run.sh
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord"]
supervisord.conf文件将包含如下内容:

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"

显然,您还需要确保首先在映像中安装了supervisord。它是大多数发行版的一部分,因此您可能可以使用yum或apt-get来安装它。

谢谢,我以前使用过supervisord,我确实想到了这一点,但为了遵循Docker的最佳实践,我试图避免每个容器运行多个主进程。也就是说,这可能是目前的最佳选择。直到docker compose支持到来。那么,我可能误解了您的意图。我以为您想在一个容器中运行多个进程?这就是说,该指南实际上是一个非常“温和”的最佳实践。当它有意义时,这是一个好主意,但它通常没有意义,有时实际上是不可能做到的。例如,我有两个进程都连接到另一个进程中的TCP套接字。链接不支持这种循环依赖关系。因此,我们要么将两个套接字绑定到主机端口,要么将两个进程放在同一个容器中。我也很好奇docker compose如何适合这幅图?谢谢,我以前使用过supervisord,我确实想到了这一点,但为了遵循Docker的最佳实践,我试图避免每个容器运行多个主进程。也就是说,这可能是目前最好的选择。直到docker compose支持到来。那么,我可能误解了您的意图。我以为您想在一个容器中运行多个进程?这就是说,该指南实际上是一个非常“温和”的最佳实践。当它有意义时,这是一个好主意,但它通常没有意义,有时实际上是不可能做到的。例如,我有两个进程都连接到另一个进程中的TCP套接字。链接不支持这种循环依赖关系。因此,我们要么将两个套接字绑定到主机端口,要么将两个进程放在同一个容器中?