正常な動作 (gosu を使用しない場合)
gosu
環境変数が設定されている場合はユーティリティを使用して特定のユーザーとして指定されたコマンドを実行するか、ルートとして実行するエントリポイント スクリプトを呼び出すコンテナーがあります。
entrypoint.sh
if [ -n "$RUNAS_USER" ]; then
exec /usr/local/bin/gosu $RUNAS_USER "$@"
else
exec "$@"
fi
RUNAS_USER
env var が提供されていない場合(つまりexec "$@"
、 が実行され、コンテナーが root として実行されている場合)、コンテナーにログインして run を実行すると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 "$@"
が実行され、コンテナが特定のユーザーとして実行されている場合)、コンテナにログインして run を実行する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 サービスのポッドに外部からルーティング可能なポートをセットアップしなかったことを意味します。