0

正常行为(不使用 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时(即执行并且容器以 root 身份运行),当我登录到容器并运行时,我可以看到进程与端口正确关联(查看最后一列):exec "$@"ss -nltp

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",pid=7,fd=205))
LISTEN                                   0                                        128                                                                              0.0.0.0:8080                                                                            0.0.0.0:*                                       users:(("java",pid=7,fd=204))
LISTEN                                   0                                        50                                                                               0.0.0.0:9010                                                                            0.0.0.0:*                                       users:(("java",pid=7,fd=186))

意外行为(使用 gosu)

RUNAS_USER提供 env var 时(即exec /usr/local/bin/gosu $RUNAS_USER "$@"执行并且容器作为特定用户运行),当我登录到容器并运行ss -nltp时,端口不再与任何进程关联(即users:(("java",pid=7,fd=187))输出中没有 etc 条目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       

问题

当容器成功将端口与底层进程关联时,该端口在网络外部可见。但是,使用时出现上述问题gosu意味着我的 K8s 部署没有设置可从外部路由到我的 nodeport 服务的 pod 的端口。

4

0 回答 0