我已将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脚本启动这两项服务吗?
答案 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