使用
启动服务是一种很好的做法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
。尽管脚本中有多个命令(envsubst
和ngingx
),这是否安全并且nginx将作为PID 1运行?
此事让我感到困惑,我想知道何时何时不使用tini
(https://github.com/krallin/tini)。
答案 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)
如果您使用的是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