为什么在使用 gosu 时进程不会与端口相关联?

问题描述

正常行为(不使用 gosu)

我有一个调用入口点脚本的容器,该脚本使用 gosu 实用程序在设置了 env var 时以特定用户身份运行指定命令,否则以 root 身份运行:

入口点.sh

if [ -n "$RUNAS_USER" ]; then
    exec /usr/local/bin/gosu $RUNAS_USER "$@"
else
    exec "$@"
fi

当没有提供 RUNAS_USER env var 时(即 exec "$@" 被执行并且容器以 root 身份运行),当我登录到容器并运行 {{1 }},我可以看到进程与端口正确关联(查看最后一列):

ss -nltp

意外行为(使用 gosu)

当提供 6e9b3af868c3:/ # ss -nltp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 50 0.0.0.0:39995 0.0.0.0:* users:(("java",pid=7,fd=187)) LISTEN 0 128 0.0.0.0:8076 0.0.0.0:* users:(("java",fd=205)) LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("java",fd=204)) LISTEN 0 50 0.0.0.0:9010 0.0.0.0:* users:(("java",fd=186)) env var 时(即执行 RUNAS_USER 并且容器以特定用户身份运行),当我登录容器并运行 exec /usr/local/bin/gosu $RUNAS_USER "$@" 时,端口不再与任何进程相关联(即 ss -nltp输出中没有 users:(("java",fd=187)) 等条目):

ss -nltp

问题

当容器成功将端口与底层进程相关联时,该端口在网络外部可见。但是,使用 b13a253cd5bf:/ # ss -nltp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:8076 0.0.0.0:* LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* LISTEN 0 50 0.0.0.0:9010 0.0.0.0:* LISTEN 0 50 0.0.0.0:46613 时的上述问题意味着我的 K8s 部署没有设置可从外部路由到我的 nodeport 服务的 pod 的端口。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)