dockerfile cmd运行多个命令

时间:2017-11-29 12:13:33

标签: docker cmd

我已将dockinabox和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开始启动。

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

2 个答案:

答案 0 :(得分:2)

您必须永远不要在entrypoint.sh中在后台启动服务! docker-stop命令只将SIGINT发送到容器的PID 1以允许它干净地关闭,十秒后它将成为剩余进程的SIGKILL。除非entrypoint.sh有一些"陷阱"第一部分可以轻易地删除所包含的数据。

我在处理https://github.com/gdraheim/docker-systemctl-replacement时已经了解了这些细节,因此它也可以作为init-replacement运行。在该模式中,您只需说明CMD /usr/bin/systemctl.py,并且启用的每个systemD服务都将运行其ExecStart序列。在docker-stop之后,它将运行他们的ExecStop以进行干净关闭。

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

答案 1 :(得分:1)

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

但有时它更容易或出于其他原因:

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

您可以尝试更换此行" src / redis-server"使用" nohup src / redis-server&",然后redis将在fork进程中启动,并让shellinaboxd启动。

使用docker-compose解决方案:

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