我试图在我的docker容器中运行shell脚本.问题是shell脚本生成另一个进程,它应该继续运行,除非使用另一个关闭脚本来终止由启动脚本生成的进程.
当我运行以下命令时,
docker run image:tag /bin/sh /root/my_script.sh
Run Code Online (Sandbox Code Playgroud)
然后,
docker ps -a
Run Code Online (Sandbox Code Playgroud)
我看到该命令已退出.但这不是我想要的.我的问题是如何让命令在后台运行而不退出?
您还没有解释为什么要在脚本退出后看到容器正在运行,或者您是否希望脚本退出.
一旦容器退出,docker容器就会CMD
退出.如果您希望容器继续运行,则需要一个可以继续运行的进程.一个选项就是在脚本末尾放置一个while循环:
while :; do
sleep 300
done
Run Code Online (Sandbox Code Playgroud)
您的脚本永远不会退出,因此您的容器将继续运行.如果你的容器托管的网络服务(Web服务器,数据库服务器等),那么这通常是由于容器的寿命运行的过程.
如果您的脚本意外退出,您可能需要查看容器日志(docker logs <container>
)并可能向脚本添加一些调试.
如果你只是问,"我怎么在后台运行的容器?",然后周华健的回答(通过-d
标志docker run
)会帮助你.
使用以下命令在后台运行带有脚本的容器
docker run -i -t -d image:tag /bin/sh /root/my_script.sh
Run Code Online (Sandbox Code Playgroud)
检查容器IDdocker ps
通过命令
然后验证您的脚本是否在容器上执行
docker exec <id> /bin/sh -l -c "ps aux"
Run Code Online (Sandbox Code Playgroud)
docker运行的进程在UNIX进程树中代替了init。init
是最顶层的父进程,一旦退出,docker容器就会停止。任何子进程(现在是孤立进程)也将停止。
$ docker pull busybox >/dev/null
$ time docker run --rm busybox sleep 3
real 0m3.852s
user 0m0.179s
sys 0m0.012s
Run Code Online (Sandbox Code Playgroud)
因此,您不能允许父pid退出,但是您有两个选择。您可以将父进程保留在原处,并允许其管理其wait
子进程(例如,通过告诉它直到所有子进程都退出)
$ time docker run --rm busybox sh -c 'sleep 3 & wait'
real 0m3.916s
user 0m0.178s
sys 0m0.013s
Run Code Online (Sandbox Code Playgroud)
…或者您可以使用将子进程替换为子进程exec
。这意味着新命令正在父进程的空间中执行…
$ time docker run --rm busybox sh -c 'exec sleep 3'
real 0m3.886s
user 0m0.173s
sys 0m0.010s
Run Code Online (Sandbox Code Playgroud)
根据子进程的性质,后一种方法可能很复杂,但是在运行上,Docker习惯上减少了不必要的进程的运行。(这并不是说您应该只有一个过程。)
归档时间: |
|
查看次数: |
22362 次 |
最近记录: |