0

我有一个 Pid 1 问题。好的,所以为了解释,我需要专注于我对问题的表述。

我有一项服务,它依赖于 hostid 和生成的许可证文件以匹配 hostid 以便运行。我不知道hostid是如何产生的。如果该服务没有有效的许可证,则进程将关闭。所以我无法将这个简单的服务容器化。

但是,如果我有另一个进程首先运行,比如设置许可文件的 API,以及查询 hostid。然后这个 api 可以将许可文件设置到位。但现在到了棘手的部分,我如何切换运行 PID 1 的进程?因为服务需要作为 PID 1 运行。

我正在考虑将 PID 1 缩写为 bash 循环,该循环首先启动 API,然后在 API 退出时启动服务。

这可能吗?

您将如何创建 bash 循环?

4

1 回答 1

1

C execve (2)函数将当前进程替换为一个新进程;新进程保留有效用户 ID 等属性,并且具有相同的进程 ID。Bourne shell 包括一个exec做同样事情的内置程序。

Docker 映像中的一个常见模式是使用入口点包装脚本进行首次设置。如果容器同时具有入口点和命令,则命令将作为参数传递给入口点。因此,您可以编写如下脚本:

#!/bin/sh

# Do whatever's needed to get the license
/opt/myapp/bin/get_license

# Then run the command part
#   exec replaces this script, so it will have pid 1
#   "$@" is the command-line arguments
exec "$@"

在 Dockerfile 中,将 设置ENTRYPOINT为此包装器,并将 设置CMD为运行真正的服务。

# Run the script above
# ENTRYPOINT must have JSON-array syntax in this usage
ENTRYPOINT ["/opt/myapp/bin/start_with_license"]

# Say the normal thing you want the container to do
# CMD can have either JSON-array or shell syntax
CMD ["/opt/myapp/bin/server", "--foreground"]
于 2021-02-07T12:47:45.337 回答