在一个docker容器中启动两个服务器

时间:2016-10-23 15:01:00

标签: docker dockerfile

我创建了一个包含所有配置的python server.py

最后我想从npm start运行一个python服务器 还有来自CMD

的节点服务器

因为我可以有一个ENTRYPOINTdocker run如何在执行JVM_OPTS="$JVM_OPTS -Dcassandra.ignore_rack=true -Dcassandra.ignore_dc=true"时启动这两个服务器?

Docker推荐的处理这类情况的方法是什么?

3 个答案:

答案 0 :(得分:2)

如果要在一个容器中运行多个进程,可以使用supervisord - 例如npmpython server

查看documentation for supervisord了解详情。

我只选了一些重要的部分。

  • 1,您需要为docker image安装supervisord

类似的东西:

CentOS: `yum install supervisor`

Ubuntu: `apt-get install -y supervisor`
  • 2,将supervisord(supervisord.conf)的配置复制到docker镜像

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

在您的情况下,supervisord.conf应如下所示(未经测试):

[supervisord]
nodaemon=true

[program:npm]
command=npm start

[program:python]
command=python server.py

并在Dockerfile中运行supervisord CMD命令:

...
# install supervisord
# copy supervisord configuration
...
# run supervisord
CMD ["/usr/bin/supervisord"]

答案 1 :(得分:0)

所以更新后的答案是现在可以使用pip安装主管 运行pip install --upgrade supervisor。 administratord.conf仍然与@VladoDemcak正确指出的相同。并且可以使用CMD命令运行受监管的人

CMD ["supervisord", "-c", "./path/to/supervisord.conf"]在docker容器中。 -c标记用于指定conf文件的路径。

答案 2 :(得分:0)

这是一种简单轻巧的方法。

步骤1 :创建脚本文件runner.sh

#!/bin/bash
python server.py &
P1=$!
npm start &
P2=$!
wait $P1 $P2

第2步:在Dockerfile的末尾添加以下行

..
..
COPY runner.sh /scripts/runner.sh
RUN ["chmod", "+x", "/scripts/runner.sh"]
ENTRYPOINT ["/scripts/runner.sh"]

就像奶油一样

说明

  1. some_command &意味着运行some_command并将其置于后台
  2. python server.py &意味着运行python server.py并将此过程置于后台。

注意:这适用于具有基于 Debian 的基础映像(如Ubuntu

)的Docker映像