微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以在容器中使用 PID 1 切换进程?

如何解决是否可以在容器中使用 PID 1 切换进程?

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

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

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

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

这可能吗?

你将如何创建 bash 循环?

解决方法

C execve(2) 函数用一个新进程替换当前进程;新进程保留诸如有效用户 ID 之类的属性,并且它具有相同的进程 ID。 Bourne shell 包含一个内置的 exec 来做同样的事情。

Docker 镜像中的一个常见模式是使用入口点包装器脚本进行首次设置。如果容器同时具有入口点和命令,则 the command gets passed as arguments to the entrypoint。因此,您可以编写如下脚本:

#!/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"]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。