例如在redis官方图片中:
https://github.com/docker-library/redis/blob/master/2.8/docker-entrypoint.sh
#!/bin/bash
set -e
if [ "$1" = 'redis-server' ]; then
chown -R redis .
exec gosu redis "$@"
fi
exec "$@"
Run Code Online (Sandbox Code Playgroud)
为什么不像往常一样运行命令而不在它们之前的exec?
Adr*_*uat 47
正如@Peter Lyons所说,使用exec将替换父进程,而不是运行两个进程.
这在Docker中非常重要,可以正确代理信号.例如,如果Redis是在没有exec的情况下启动的,它将不会接收到SIGTERM
,docker stop
并且不会有机会干净地关闭.在某些情况下,这可能会导致数据丢失或僵尸进程.
如果确实启动了子进程(即不使用exec),则父进程负责处理和转发信号.这是在容器中运行多个进程时最好使用supervisord或类似的原因之一,因为它会适当地转发信号.
Pet*_*ons 17
如果没有exec,父shell进程将继续存在并等待子进程退出.使用exec,子进程完全替换父进程,所以当父进程分配后父进程没有任何内容时,我会考虑exec
更精确/正确/有效.在宏观方案中,我认为将其归类为次要优化可能是安全的.
没有执行官
与执行官
归档时间: |
|
查看次数: |
12243 次 |
最近记录: |