Docker 如果我们在entrypoint.sh中引导应用程序,应用程序是否会以PID 1运行并接收信号?

Docker 如果我们在entrypoint.sh中引导应用程序,应用程序是否会以PID 1运行并接收信号?,docker,nginx,dockerfile,Docker,Nginx,Dockerfile,这是一个很好的实践,以 CMD ["/go/bin/myapp"] 而不是 CMD /go/bin/myapp 在第一种方式中,SIGTERMs被应用程序捕获,而在第二种方式中,它们被底层的/bin/sh脚本捕获,脚本不会将它们转发给服务。这是我从学校学到的 现在我想知道CMD[“…”]是否完全等同于将..放入/entrypoint.sh脚本并调用CMD[“/entrypoint.sh”]?现在子应用程序是否也将作为PID 1运行,从而接收所有信号 作为一个具体示例,我想创建一个脚本,其中包

这是一个很好的实践,以

CMD ["/go/bin/myapp"]
而不是

CMD /go/bin/myapp
在第一种方式中,SIGTERMs被应用程序捕获,而在第二种方式中,它们被底层的
/bin/sh
脚本捕获,脚本不会将它们转发给服务。这是我从学校学到的

现在我想知道
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;'
envsubst/etc/nginx/conf.d/default.conf
&&
nginx-g“守护进程关闭;”
并在我的
Dockerfile
末尾调用
CMD[“/entrypoint.sh”]
。这是否安全?即使脚本中有多个命令(
envsubt
ngnx
),nginx是否仍将作为PID 1运行


这件事让我很困惑,我试图弄清楚什么时候以及什么时候不使用
tini
()。

以下是我尝试遵循的MySQL 5.7的功能。。。但是使用了Nginx图像

Dockerfile:

FROM nginx:latest
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod 777 /usr/local/bin/docker-entrypoint.sh

ENTRYPOINT ["docker-entrypoint.sh"] 
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
#!/bin/bash
set -e

echo "preparing..."

exec "$@"
docker entrypoint.sh:

FROM nginx:latest
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod 777 /usr/local/bin/docker-entrypoint.sh

ENTRYPOINT ["docker-entrypoint.sh"] 
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
#!/bin/bash
set -e

echo "preparing..."

exec "$@"
其思想是在
docker entrypoint.sh
脚本中做任何必要的准备工作,然后使用
exec“$@”
将信号传递给
CMD
。(这意味着您必须在
docker entrypoint.sh
内部使用
envsubt/etc/nginx/conf.d/default.conf


相关示例链接到
Dockerfile
文档:

引用:

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

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

#!/bin/sh

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