Кубернетес: когда мне нужно добавить /bin/sh-c в свою команду?

#kubernetes #kubectl #kubernetes-jobs

Вопрос:

Я готовлюсь к экзамену CKAD и занимаюсь практикой с вопросами, представленными здесь

У меня есть сомнения по поводу этих двух разных способов выполнения команд. Здесь приведен пример с заданием, но я думаю, что вопрос может быть более общим и расширяемым для всех контейнеров.

В разделе «Задания» есть два запроса:

Создайте задание с именем pi с помощью image perl, которое запускает команду с аргументами «perl-Mbignum=bpi-wle ‘печать bpi(2000)'».

 kubectl create job pi  --image=perl -- perl -Mbignum=bpi -wle 'print bpi(2000)'
 

Создайте задание с помощью окна «Работа с изображениями», которое выполняет команду » echo hello;спящий режим 30;мир эха

 kubectl create job busybox --image=busybox -- /bin/sh -c 'echo hello;sleep 30;echo world'
 

Почему во второй команде мне также нужно указать /bin/sh-c?

Как я мог понять, когда его использовать, а когда нет?

Комментарии:

1. Вы используете ; , который является не аргументом echo , а разделителем, анализируемым оболочкой, поэтому вам нужна оболочка для его анализа и выполнения. В противном случае вы бы работали echo с аргументами hello;sleep и 30;echo и world , что, скорее всего, не то, что вы хотите.

2. Большое вам спасибо за ответ, не хотели бы вы добавить его в качестве ответа, чтобы я мог его принять?

Ответ №1:

Потому что в первом примере

 kubectl create job pi  --image=perl -- perl -Mbignum=bpi -wle 'print bpi(2000)'
 

вы вызываете perl переводчика, perl -Mbignum=bpi -wle 'print bpi(2000)'

и во втором примере вы вызываете команду оболочки bash, echo hello;sleep 30;echo world поэтому /bin/sh -c

 kubectl create job busybox --image=busybox -- /bin/sh -c 'echo hello;sleep 30;echo world'
 

Говорится -- , что после этого внутри контейнера выполняется команда.

Комментарии:

1. Спасибо за ответ, я хотел спросить вас еще кое о чем, если это возможно. Если команда является чем-то более простым, например»sleep 3600″, нужно ли мне указывать»/bin/sh-c» до или просто «sleep 3600» в разделе команд (конечно, с правильным синтаксисом [«sleep», «3600»] будет работать нормально?

2.Вы могли бы заглянуть внутрь контейнера, но я предполагаю, что /bin/sh это будет просто символическая ссылка /bin/bash . Пример: $ ls -l /bin/sh lrwxrwxrwx. 1 root root 4 Jun 1 2020 /bin/sh -> bash $ readlink -f /bin/sh /usr/bin/bash Так /bin/sh что на самом деле это просто абстракция для вашей текущей оболочки. Будьте осторожны, это также может быть zsh или ash и т. Д. Поэтому, если вы хотите, чтобы эта команда была выполнена с вашей текущей настроенной оболочкой, используйте /bin/sh -c "<command>" . Если вы выполнили только sleep 3600 это, возможно, что в некоторых контейнерах оболочка не настроена, PATH поэтому она может закончиться ошибкой.