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。
这是我在一个容器中运行多个服务的方式。