正常行为(不使用 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 的端口。