ahmed meraj
ahmed meraj

Reputation: 886

Executing multiple commands( or from a shell script) in a kubernetes pod

I'm writing a shell script which needs to login into the pod and execute a series of commands in a kubernetes pod.

Below is my sample_script.sh:

kubectl exec octavia-api-worker-pod-test -c octavia-api bash
unset http_proxy https_proxy
mv /usr/local/etc/octavia/octavia.conf /usr/local/etc/octavia/octavia.conf-orig
/usr/local/bin/octavia-db-manage --config-file /usr/local/etc/octavia/octavia.conf upgrade head

After running this script, I'm not getting any output. Any help will be greatly appreciated

Upvotes: 47

Views: 101552

Answers (4)

JuanD
JuanD

Reputation: 463

Posting here because google search still brings you to this post...

I'd like to throw out using a HEREDOC as an additional possibility.

kubectl exec -i --tty=false PODNAME -- bash << EOF
echo "insert all your commands here."
echo "this subprocess will even pickup any variables you have in"
echo "the shell script that is calling this"
EOF

Upvotes: 9

RB7
RB7

Reputation: 475

The following should work

kubectl -it exec podname -- bash -c "ls && ls"

bin   dev   etc   home  proc  root  run   sys   tmp   usr   var bin  
dev   etc   home  proc  root  run   sys   tmp   usr   var

If above command doesn't work then try too replace bash with one of the following /bin/bash, sh or /bin/sh

Upvotes: 11

dmitry_podyachev
dmitry_podyachev

Reputation: 649

-t can solve your task

For example, I run here few cmd:

kubectl get pods |grep nginx|cut -f1 -d\  |\
while read pod; \
 do echo "$pod writing:";\
  kubectl exec -t $pod -- bash -c \
   "dd if=/dev/zero of=/feeds/test.bin bs=260K count=4 2>&1|\
    grep copi |cut -d, -f4; \
    a=$SECONDS; echo -ne 'reading:'; cat /feeds/test.bin >/dev/null ; \
    let a=SECONDS-a ; \
    echo $a sec"
done

p.s. your example will be:

kubectl exec -t octavia-api-worker-pod-test -c octavia-api -- bash -c "unset http_proxy https_proxy ; mv /usr/local/etc/octavia/octavia.conf /usr/local/etc/octavia/octavia.conf-orig ; /usr/local/bin/octavia-db-manage --config-file /usr/local/etc/octavia/octavia.conf ; upgrade ; head"

Upvotes: 4

ahmet alp balkan
ahmet alp balkan

Reputation: 45196

Are you running all these commands as a single line command? First of all, there's no ; or && between those commands. So if you paste it as a multi-line script to your terminal, likely it will get executed locally.

Second, to tell bash to execute something, you need: bash -c "command".

Try running this:

$ kubectl exec POD_NAME -- bash -c "date && echo 1"

Wed Apr 19 19:29:25 UTC 2017
1

You can make it multiline like this:

$ kubectl exec POD_NAME -- bash -c "date && \
      echo 1 && \
      echo 2"

Upvotes: 104

Related Questions