質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%

Q&A

解決済

1回答

6283閲覧

kubectl execの-i と -t オプションについて

dbfreak

総合スコア20

0グッド

0クリップ

投稿2021/03/14 10:09

編集2022/01/12 10:55

kubectl execの-i,-tオプションをおまじない的に使ってきましたが、本当の意味が分からず悩んでいます。
以下のリファレンスを見ると、

  • -i: Pass stdin to the container
  • -t: Stdin is a TTY

と書いてあります。

コンテナ内部でlsを実行し、応答を表示することを期待して以下のコマンドで違いが出るかを試しました。
オプション無し、-i が付かない場合はエラーになるかと思ったのですが、オプションの有無に関わらず全て期待通りに動作しました。
なぜこのような動作になるのかご教示いただけないでしょうか。

あと、-iと-tって同じことを言っている気がするのですが違いって何なのでしょうか。
そもそもttyってなんだっけとかは最低限ググってみたのですが。。

実験結果

powershell

1PS C:\k8s\dojo> kubectl exec liveness-check -- ls /usr/share/nginx/html/index.html 2/usr/share/nginx/html/index.html 3 4PS C:\k8s\dojo> kubectl exec -t liveness-check -- ls /usr/share/nginx/html/index.html 5/usr/share/nginx/html/index.html 6 7PS C:\k8s\dojo> kubectl exec -i liveness-check -- ls /usr/share/nginx/html/index.html 8/usr/share/nginx/html/index.html 9 10PS C:\k8s\dojo> kubectl exec -it liveness-check -- ls /usr/share/nginx/html/index.html 11/usr/share/nginx/html/index.html

pod作成に利用したyaml

apiVersion: v1 kind: Pod metadata: name: liveness-check spec: containers: - image: nginx name: nginx livenessProbe: httpGet: port: 80 path: / failureThreshold: 5 periodSeconds: 5

自環境の情報

PS C:\k8s\dojo> minikube version minikube version: v1.16.0 commit: 9f1e482427589ff8451c4723b6ba53bb9742fbb1 PS C:\k8s\dojo> kubectl version Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:59:43Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"windows/amd64"} Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:51:19Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ざっくり回答になります。

-i は、標準入力を可能にする
-t は、標準入力を可能にする際に、TTY(ここでは接続先Containerの接続情報)を表示する

execでlsではなく、インタラクティブな動作を実施すると差異がわかりやすいです。
以下例では、ActivemqのAlpine Linuxコンテナに対してashコマンドを実行しインタラクティブな操作をする場合になります。

sh

1[admin@okd4-services ~]$ k exec -t activemq-784f95b597-4llz2 -- ash 2[admin@okd4-services ~]$ echo $? 30 4 5[admin@okd4-services ~]$ k exec -i activemq-784f95b597-4llz2 -- ash 6ls 7artemis 8artemis-service 9exit 10[admin@okd4-services ~]$ echo $? 110 12 13[admin@okd4-services ~]$ k exec -ti activemq-784f95b597-4llz2 -- ash 14/var/lib/artemis/bin # ls 15artemis artemis-service 16/var/lib/artemis/bin # exit 17[admin@okd4-services ~]$ echo $? 180

-tのみの場合は、標準入力を可能にしていないため、ashを呼び、エラーなく正常に終了します。
-iのみの場合は、-itと比較すると、接続先情報(/var/lib/artemis/bin #)が表示されませんが、インタラクティブに操作することが可能です。

投稿2021/06/12 15:00

yurak

総合スコア160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問