在docker入口点脚本中使用exec有什么目的?

例如在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 "$@"

为什么不像往常一样在没有exec的情况下运行命令呢?

回答:

正如@Peter Lyons所说,使用exec将替换父进程,而不是运行两个进程。

这对于在Docker中正确代理信号很重要。例如,如果Redis是在没有exec的情况下启动的,则它将不会收到SIGTERMon docker

stop,也不会有机会彻底关闭。在某些情况下,这可能导致数据丢失或僵尸进程。

如果您确实启动了子进程(即不使用exec),则父进程将负责适当地处理和转发信号。这是在容器中运行多个进程时最好使用supervisor或类似命令的原因之一,因为它将适当地转发信号。

以上是 在docker入口点脚本中使用exec有什么目的? 的全部内容, 来源链接: utcz.com/qa/404999.html

回到顶部