Kubectl exec: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
No edit summary
 
(18 intermediate revisions by the same user not shown)
Line 5: Line 5:
Execute a command in a container:
Execute a command in a container:


kubectl exec <''pod''|''type/name''> [-c <''container''>] [''flags''] -- <''command''> [''args''...] [''options'']
<syntaxhighlight lang='text'>
kubectl exec <pod-name|type/name> [-c <container>] [flags] -- <command> [args...] [options]
</syntaxhighlight>


Example:
Do not surround the command and its flags/arguments with quotes unless that is how it would execute normally (i.e., do ls -t /usr, not "ls -t /usr").
==The Role of '--' on Command Line==


  kubectl exec my-pod --
The '--' is a sequence of characters that signals to kubectl to stop scanning command line for its own flags and options (sequences that start with -). Everything after the double dash is a command that should be executed inside the pod.


=Flags=
Using the double dash is optional if the command to be executed inside the pod has no arguments that start with dash.
==-c,--container= ==
 
The name of the container to execute the command into. If omitted, the first container in the pod will be chosen.
However, double dash is required if the command to be executed has its own command line arguments that start with dash. If the command you want to execute in the pod has any flags in common (e.g. -i), two dashes (--) must be used to separate the command's flags/arguments from kubectl's commands/arguments.
==-i,--stdin=false ==
 
Pass stdin to the container.
For example:
==-t,--tty=false==
<syntaxhighlight lang='text'>
Stdin is a TTY
kubectl exec my-pod -it bash -c my-command
==--pod-running-timeout= ==
</syntaxhighlight>
The length of time (like 5s, 2m, or 3h, higher than zero) to wait until at least one pod is running.
 
will fail because kubectl will interpret "-c" as a container name flag and try to look up "my-command" as a container in the pod - which will fail.
 
The correct command is:
<syntaxhighlight lang='text'>
kubectl exec my-pod -it -- bash -c my-command
</syntaxhighlight>
which tells kubectl to execute "bash -c my-command" as command on the pod.
 
=Example=
 
==<span id='Read-Only_Commands'></span>Execute Commands Remotely into a Pod==
 
Get the date on the target pod:
<syntaxhighlight lang='bash'>
kubectl exec my-pod -- date
</syntaxhighlight>


List the content of the container's root filesystem.


<syntaxhighlight lang='bash'>
kubectl exec my-pod -- ls /
</syntaxhighlight>


Examples:
Delete a file on the container's root filesystem:
  # Get output from running 'date' command from pod mypod, using the first container by default
<syntaxhighlight lang='bash'>
  kubectl exec mypod date
kubectl exec my-pod -- rm /tmp/some.file
</syntaxhighlight>


  # Get output from running 'date' command in ruby-container from pod mypod
If the target file does not exist, the kubectl returns a non-zero exit code:
  kubectl exec mypod -c ruby-container date
<syntaxhighlight lang='bash'>
kubectl exec my-pod -- rm /tmp/some.file; echo $?
rm: can't remove '/tmp/some.file': No such file or directory
command terminated with exit code 1
1
</syntaxhighlight>


  # Switch to raw terminal mode, sends stdin to 'bash' in ruby-container from pod mypod
Note that [[Bash_Command_Line_Expansion#Globbing|globbing]] cannot be used with commands like <code>rm</code> or <code>ls</code> executed directly. A shell will be needed to interpret it:
  # and sends stdout/stderr from 'bash' back to the client
<syntaxhighlight lang='bash'>
  kubectl exec mypod -c ruby-container -i -t -- bash -il
kubectl exec my-pod -- sh -c 'rm /tmp/some-dir/*'
</syntaxhighlight>


  # List contents of /usr from the first container of pod mypod and sort by modification time.
==Interactive Commands==
  # If the command you want to execute in the pod has any flags in common (e.g. -i),
  # you must use two dashes (--) to separate your command's flags/arguments.
  # Also note, do not surround your command and its flags/arguments with quotes
  # unless that is how you would execute it normally (i.e., do ls -t /usr, not "ls -t /usr").
  kubectl exec mypod -i -t -- ls -t /usr


  # Get output from running 'date' command from the first pod of the deployment mydeployment, using the first container
Start a bash into the container,  switch to raw terminal mode, send stdin to the bash process in pod my-pod and sends stdout/stderr from 'bash' back to the client:
by default
  kubectl exec deploy/mydeployment date


  # Get output from running 'date' command from the first pod of the service myservice, using the first container by
<syntaxhighlight lang='bash'>
default
kubectl exec my-pod -it -- bash -il
  kubectl exec svc/myservice date
</syntaxhighlight>


Usage:
=Flags=
 
==-c,--container= ==
The name of the container to execute the command into. If omitted, the first container in the pod will be chosen.
==-i,--stdin=false ==
Pass stdin to the container.


Use "kubectl options" for a list of global command-line options (applies to all commands).
==-t,--tty=false==
Stdin is a TTY
==--pod-running-timeout= ==
The length of time (like 5s, 2m, or 3h, higher than zero) to wait until at least one pod is running.

Latest revision as of 02:25, 18 May 2021

Internal

Overview

Execute a command in a container:

kubectl exec <pod-name|type/name> [-c <container>] [flags] -- <command> [args...] [options]

Do not surround the command and its flags/arguments with quotes unless that is how it would execute normally (i.e., do ls -t /usr, not "ls -t /usr").

The Role of '--' on Command Line

The '--' is a sequence of characters that signals to kubectl to stop scanning command line for its own flags and options (sequences that start with -). Everything after the double dash is a command that should be executed inside the pod.

Using the double dash is optional if the command to be executed inside the pod has no arguments that start with dash.

However, double dash is required if the command to be executed has its own command line arguments that start with dash. If the command you want to execute in the pod has any flags in common (e.g. -i), two dashes (--) must be used to separate the command's flags/arguments from kubectl's commands/arguments.

For example:

kubectl exec my-pod -it bash -c my-command

will fail because kubectl will interpret "-c" as a container name flag and try to look up "my-command" as a container in the pod - which will fail.

The correct command is:

kubectl exec my-pod -it -- bash -c my-command

which tells kubectl to execute "bash -c my-command" as command on the pod.

Example

Execute Commands Remotely into a Pod

Get the date on the target pod:

kubectl exec my-pod -- date

List the content of the container's root filesystem.

kubectl exec my-pod -- ls /

Delete a file on the container's root filesystem:

kubectl exec my-pod -- rm /tmp/some.file

If the target file does not exist, the kubectl returns a non-zero exit code:

kubectl exec my-pod -- rm /tmp/some.file; echo $?
rm: can't remove '/tmp/some.file': No such file or directory
command terminated with exit code 1
1

Note that globbing cannot be used with commands like rm or ls executed directly. A shell will be needed to interpret it:

kubectl exec my-pod -- sh -c 'rm /tmp/some-dir/*'

Interactive Commands

Start a bash into the container, switch to raw terminal mode, send stdin to the bash process in pod my-pod and sends stdout/stderr from 'bash' back to the client:

kubectl exec my-pod -it -- bash -il

Flags

-c,--container=

The name of the container to execute the command into. If omitted, the first container in the pod will be chosen.

-i,--stdin=false

Pass stdin to the container.

-t,--tty=false

Stdin is a TTY

--pod-running-timeout=

The length of time (like 5s, 2m, or 3h, higher than zero) to wait until at least one pod is running.