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