dockerfile cmd运行多个命令

我已经把shellinabox和redis结合起来了。

我的Dockerfile如下所示:

CMD ['/usr/local/work/scripts/run.sh'] ENTRYPOINT ["bin/bash"] EXPOSE 4200/tcp 

run.sh如下所示:

 #!/bin/bash cd $REDIS_HOME src/redis-server /usr/bin/shellinaboxd -p 4200 

我想在docker启动时启动redis服务器和shellinabox。 只有redis才是开始。

当我启动docker并使用ctrl + c shellinabox开始启动。

我知道如何使用'主pipe'弄清楚这一点。 任何人都知道如何使用shell脚本启动这两个服务?

在Docker哲学中,每个容器应该有一个进程,可以使用docker-compose启动两个容器,一个用于redis,一个用于shellinaboxd。

但有时候更容易或者其他一些原因:

在脚本shell“src / redis-server”中启动redis并保持连接到控制台,直到它停止(例如ctrl + c),然后启动shellinaboxd。

你可以尝试用“nohup src / redis-server&”replace这行“src / redis-server”,然后redis将在fork进程中启动,并且让shellinaboxd启动。

解决scheme与docker构成:

 version: '2' services: redis: build: ./Dockerfile command: /usr/bin/src/redis-server shellinabox: build: ./Dockerfile ports: - 4200:4200 command: /usr/bin/shellinaboxd -p 4200 

您绝对不能在entrypoint.sh中的后台启动服务! docker-stop命令将仅向容器的PID 1发送一个SIGINT,以便干净地closures它,十秒钟之后它将成为对其余进程的SIGKILL。 除非entrypoint.sh有一些“陷阱”部分,否则可以很容易地垃圾包含的数据。

https://github.com/gdraheim/docker-systemctl-replacement上工作时,我已经了解了这些细节,以便它可以作为initreplace运行。 在这种模式下,您只需说CMD /usr/bin/systemctl.py,并且启用的每个systemD服务都将运行它们的ExecStart序列。 docker停止后,将会运行ExecStop以进行彻底closures。

这是我在一个容器中运行多个服务的方式。