建议最佳做法是不要将dockerized Node.JS应用程序作为PID 1(请参阅https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#handling-kernel-signals)运行,以便正确捕获信号。
docker run
命令提供--init
标志,用一个小的init系统包装应用程序入口点,该系统可以正确转发信号。
Kubernetes中是否有内置等效的--init
标志?
我已经探讨了Kubernetes 1.10的Pod和Container对象规范,但没有看到任何与指定图像如何开始相关的内容。
另一种方法是在每个容器中明确包含和使用Tini,但我真的希望某种方式以--init
标志的行为方式透明地进行。{/ p>
还有其他选择吗?
答案 0 :(得分:3)
如果您为Pod启用了进程(PID)名称空间共享,则初始化进程(SELECT
T.id,
MAX(T.date) max_date,
(
SELECT
MAX(N.date)
FROM
YourTable N
WHERE
N.id = T.id AND
N.date < MAX(T.date)
) penultimate
FROM
YourTable T
GROUP BY
T.id
)将来自Kubernetes。如果您的容器具有单独的进程名称空间,则它们需要自己包含pause
或其他init进程。
根据https://www.ianlewis.org/en/almighty-pause-container,Kubernetes 1.7默认情况下具有共享的进程名称空间,并且具有kubelet标志来禁用它,1.8缺省情况下具有它的关闭状态以及kubelet标志来启用它。 Kubernetes 1.11具有Alpha功能以启用共享的进程名称空间: https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/
答案 1 :(得分:2)
如果您认为Kubernetes使用Docker命令创建容器,那么您应该知道它对--init
密钥一无所知。换句话说,Kubernetes没有用另一个初始过程启动容器的包装器。
因此,如果您想在Kubernetes中使用此功能,则需要准备一个包含Tini的Docker镜像。
实际上,Tini包含在Docker 1.13或更高版本中,您只需将--init
标记传递给docker run
即可启用它。因此,要将Tini添加到图像中,请使用Dockerfile
中的以下代码:
# Add Tini
ENV TINI_VERSION <check-version-on-github>
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]
# Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]