应用程序是否将作为PID 1运行,如果我们在entrypoint.sh?

时间:2018-02-08 08:57:38

标签: docker nginx dockerfile

使用

启动服务是一种很好的做法
CMD ["/go/bin/myapp"]

而不是

CMD /go/bin/myapp

第一种方式,SIGTERM被应用程序捕获,而在第二种方式中,它们被底层/bin/sh脚本捕获,它不会将它们转发给服务。我是从https://forums.docker.com/t/docker-run-cannot-be-killed-with-ctrl-c/13108/2了解到的。

现在我想知道CMD ["..."]是否完全等同于将...放入/entrypoint.sh脚本并调用CMD ["/entrypoint.sh"]?现在,子应用程序也将作为PID 1运行,因此会接收所有信号吗?

作为一个具体的例子,我想创建一个脚本:

envsubst < /etc/nginx/conf.d/site.template > /etc/nginx/conf.d/default.conf
&&
nginx -g 'daemon off;'

CMD ["/entrypoint.sh"]结束时致电Dockerfile。尽管脚本中有多个命令(envsubstngingx),这是否安全并且nginx将作为PID 1运行?

此事让我感到困惑,我想知道何时何时不使用tinihttps://github.com/krallin/tini)。

2 个答案:

答案 0 :(得分:1)

这是我尝试遵循MySQL 5.7 Dockerfile所做的...但是使用Nginx图像。

<强> Dockerfile:

#!/bin/bash
set -e

echo "preparing..."

exec "$@"

<强> docker-entrypoint.sh:

docker-entrypoint.sh

我们的想法是在exec "$@"脚本中执行所需的任何操作,然后使用CMD将信号传递给envsubst < /etc/nginx/conf.d/site.template > /etc/nginx/conf.d/default.conf。 (这意味着您必须在docker-entrypoint.sh

中使用Dockerfile

相关示例与<button class="c-config__option c-config__option--button c-config__option--pack" data-index="0"> Item 1 <span>Subtext</span> </button> <button class="c-config__option c-config__option--button c-config__option--pack" data-index="1"> Item 2 <span>Subtext</span> </button> ... 文档的关联:If you need to write a starter script for a single executable, you can ensure that the final executable receives the Unix signals by using exec and gosu commands...

答案 1 :(得分:0)

引用tini GitHub page

  

如果您使用的是Docker 1.13或更高版本,则Tini包含在Docker中   本身。这包括所有版本的Docker CE。要启用Tini,只需   将--init标志传递给docker run。

或者您可以使用minit。它在容器启动时运行/ etc / minit / startup,在容器停止时运行/ etc / minit / shutdown。我通常使用这段代码作为入口点:

#!/bin/sh

if [ $# -gt 0 ] ; then
        exec "$@"
else
        exec /sbin/minit
fi